• 締切済み

VC++でのソケット通信について

いつも拝見させていただいております。 このたびは、皆様のお知恵をお借りしたく質問させていただきました。 ソケット通信を行いたく、以下のサンプルを作成いたしました。 この関数を5回ループさせると、エラーが起きてしまいます。 エラーコードは10061です。 解決方法をご存知の型が降りましたら、 ご教授ください。 よろしくお願いいたします。 (VC++での開発です) extern "C" __declspec( dllexport ) bool __stdcall ssl_SockOpen(LPSTR p_c_IpAddress, LPSTR p_c_PortNum) { struct sockaddr_in addr; //socketの情報を代入する構造体 WSADATA p_obj_SockInit; //Windows Sockets初期化変数 //■ Windows Socketsを初期化する WSAStartup( 0x0101, &p_obj_SockInit ); //■ ソケット確保 if( (g_obj_Socket = socket( AF_INET, SOCK_STREAM, 0 )) < 0 ){ pMsg = "ソケットの確保に失敗しました。"; return false; } //■ ソケットの情報を入れる memset( &addr, 0, sizeof( addr ) ); //構造体addrの初期化 addr.sin_family = AF_INET; //AF_INETを指定 addr.sin_port = htons( atoi( p_c_PortNum ) ); //ポートを指定 addr.sin_addr.s_addr = inet_addr( p_c_IpAddress ); //inet_addr()により指定されたIPを構造体に代入 //■ 接続要求を行う▼▼▼▼ここでエラー!!▼▼▼▼ if( connect( g_obj_Socket, (struct sockaddr *)&addr, sizeof(addr) ) < 0 ){ pMsg = "接続要求に失敗しました。"; int i; i = GetLastError( ); return false; } return( true ); }

みんなの回答

  • toysmith
  • ベストアンサー率37% (570/1525)
回答No.5

たの方もおっしゃっている事ですが気になる点がいくつかあります。 1.WSAStartupの呼び出しは1度だけ。   2回以上呼び出す時はWSACleanupの後で行う。 2.WSACleanupの呼び出しが無い。 3.shutdown,closesocketの呼び出しが無い。 4.GetlastErrorはWSAGetLastErrorをラッピングしているものと考えてよいのか? 通常、TCP/IP通信のクライアント側の流れは以下のようになります。 1.初期化(WSAStartup) 2.ServerのIPアドレス解決(gethosybyname,gethostbyaddr) 3.サービスポート解決(getportbyname) 4.ソケット生成(socket) 5.接続確立(connect) 6.データ通信のループ(send,recv) 7.切断準備(shutdown) 8.切断、ソケット廃棄(closesocket) 9.WSACleanup 今回の質問の場合、2,3は直接指定しているのでOKでしょう。 7は必須ではありませんが「お行儀の良い切断」を行う為に推奨されます。 接続を複数回繰り返すのであれば2~8をループさせます。

  • ponnta
  • ベストアンサー率17% (31/179)
回答No.4

ソケットエラーの10061は接続を拒否されたエラーだそうです。 MSDNの検索で数値をいれて検索してね。 サーバー側が同時に接続できる数を超えて繋ごうとしてるんじゃないかなー

回答No.3

エラーコードの示す通り、本当に接続が拒否されているのではないですか? 例えば相手方がNTWorkstationで、最大接続数を越えてるとか。

Princeso
質問者

補足

早速のご回答ありがとうございます。 自分が今回やりたいのは、1回線のみでよいのですが・・・ どうしたらよいのでしょう?

  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.2

サーバ側で幾つまでコネクションを持てるんでしょうね? 毎回 closesocket() すれば良いんじゃないでしょうか。 後、エラーには関係ないと思いますが WSAStartup() は アプリケーションが立ち上がったときに一発呼ぶだけで 大丈夫ですよ。

Princeso
質問者

補足

おぉ!ありがとうございます。 早速そのように変更しておきます。

  • mnabe
  • ベストアンサー率33% (427/1283)
回答No.1

ソースは一部抜粋ですよね??  これだけだとなんとも言えないのですが、確保したメモリが解放されていない為に発生していると思われます。  各オブジェクトの取得と解放を追ってみて下さい。どうもオブジェクトの解放あたりが怪しそう。

Princeso
質問者

補足

えー、Cは詳しくないので、申し訳ありませんが、 Cで、メモリの解放はどのように行うのでしょうか?(各変数、オブジェクトに使用した)

関連するQ&A

  • UDP通信について

    UDP通信で困っています。 TCP/IP通信はすぐにうまくいったのですが、 UDPの簡単なサンプルがちゃんと動きません。 間違いがあればご指摘ください。 よろしくお願いします。 (クライアント側ソース int sock; struct sockaddr_in din; memset(&din, 0, sizeof(din)); din.sin_port = htons(50050); din.sin_family = AF_INET; din.sin_addr.s_addr = inet_addr("サーバーIP"); sock = socket(AF_INET, SOCK_DGRAM, 0); int buf = 12345; sendto(sock,(char*)&buf,sizeof(int),0,(struct sockaddr*)&din,sizeof(struct sockaddr_in)); (サーバー側ソース int sock; struct sockaddr_in sin; sock = socket(AF_INET, SOCK_DGRAM, 0); memset(&sin, 0, sizeof(sin)); sin.sin_family = AF_INET; sin.sin_port = htons(50050); sin.sin_addr.s_addr = htonl(INADDR_ANY); if(bind(sock, (struct sockaddr *) &sin, sizeof(sin)) < 0) { return(1); } struct sockaddr_in fromaddr; socklen_t len = sizeof(struct sockaddr_in); int buf; recvfrom(sock,(char*)&buf,sizeof(int),0,(struct sockaddr*)&fromaddr,&len); printf("recv:%d\n",buf);

  • Cプログラム UDP送信の送信データに関して

    以下の2つのプログラムでの質問なのですが、 #include <winsock2.h> #pragma comment(lib,"ws2_32.lib") int main() { WSADATA wsaData; SOCKET sock; struct sockaddr_in addr; WSAStartup(MAKEWORD(2, 0), &wsaData); sock = socket(AF_INET, SOCK_DGRAM, 0); addr.sin_family = AF_INET; addr.sin_port = htons(3054); addr.sin_addr.S_un.S_addr = inet_addr("192.168.0.3 "); sendto(sock, "\x42\42\0\0\0\0\2\0\1\2\x44\x33\5", 13, 0, (struct sockaddr *)&addr, sizeof(addr)); closesocket(sock); WSACleanup(); return 0; } と #include <winsock2.h> #pragma comment(lib,"ws2_32.lib") int main() { WSADATA wsaData; SOCKET sock; struct sockaddr_in addr; WSAStartup(MAKEWORD(2, 0), &wsaData); sock = socket(AF_INET, SOCK_DGRAM, 0); addr.sin_family = AF_INET; addr.sin_port = htons(3054); addr.sin_addr.S_un.S_addr = inet_addr("192.168.0.3 "); sendto(sock, "HELLO", 5, 0, (struct sockaddr *)&addr, sizeof(addr)); closesocket(sock); WSACleanup(); return 0; } について、送信データ部分に「¥」入ることによって、送信プロセスでどのような処理がなされているのですか? ¥~¥までで1バイトということで処理してくださいね、と処理系?に指示しているのですか? また、「¥」はC言語ならではの表記の仕方なのですか?少し、伝えるのが難しいですが、何でもいいのでご回答頂けませんか?宜しくお願いします。

  • ソケットを使ったプログラムにおいて

    こんにちは。 winsockを使って、2PC間での通信を行いたいのですが、sockaddr_in構造体は struct sockaddr_in echoServAddr; echoServAddr.sin_family = AF_INET; echoServAddr.sin_addr.s_addr = inet_addr(servIP); echoServAddr.sin_port = htons(echoServPort); と表記されると思いますが、2PCをクロスケーブルでつないで相手を認識したい場合、servIPの値はどうなりますか? ご教授下さい。 環境: VC++ 6.0(SP5)

  • VC6.0ソケット通信プログラムについて

    お世話になります。 VC6.0でソケット通信の社内の既存のプログラムを改善しております。 クライアントより、サーバにソケットで大量に電文を送信した時に、サーバ側の処理が重くなってしまいます。 NETSTATコマンドで確認したところ、 サーバ側では、CLOSE_WAITが大量に出力されており クライアント側では、FIN_WAIT_2が大量に出力されます。 クライアント側のFIN_WAIT_2は、時間が経つと消えるのですが、サーバ側のCLOSE_WAITは残ってしまっております。 サーバ側のEXEを再起動すると、CLOSE_WAITは消えます。 サーバ側のソケットの受信後の処理に問題があるのではと考えておりますが、何処が問題なのかわからない状態です。 コードを以下に記述致します。 WINAPI K010cListener{ /*Winsock初期化*/ WSAStartup(wVersionRequested,&wsaData); /*SOCKET作成*/ fd = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP) /*ポートの設定*/ addr.sin_addr.s_addr = htonl(INADDR_ANY); addr.sin_family = AF_INET; addr.sin_port = htons(usPortNo); addrlen = sizeof(addr); /*BIND*/ bind(fd,(struct sockaddr*)&addr,addrlen) /*LISTEN*/ listen(fd,0) while(1){ /*ACCEPT*/ fd2 = accept(fd,(struct sockaddr*)&addr,&addrlen) //データ受信 waitReceiveThread(fd2, &rcv_msg); //DBオープン ConnectDB() //DB登録 AddTable(&rcv_msg) //DBクローズ CloseDB() } /*Winsock終了*/ WSACleanup(); } void waitReceiveThread(SOCKET fd, SockRcvMsg *rcv_msg) { while (1) { /*データ受信待ち*/ rcvSize = recv(fd,rcvBuf,sizeof(rcvBuf),0); if (rcvSize <= 0) { continue; } else { /* 返信電文の準備 */ memset(sndBuf,0x20,sizeof(sndBuf)); memcpy(sndBuf ,"RCMORDER00004800000000",22); /* 返信電文の送信 */ send(fd,(char*)sndBuf,sizeof(sndBuf),0); /* バッファの初期化 */ bufsize=0; memset(buf,'\0',sizeof(buf)); break; /*ループを抜ける*/ } } } 恐れ入りますが、ご教授いただければ幸いです。 宜しくお願い申し上げます。

  • コンソールアプリケーションで通信したい

    クライエントプログラムを起動もしていないのに、アクセスがありましたと表示されます。 どこが悪いのか教えてくださいませんでしょうか? サーバー側 #include <stdio.h> #include <winsock2.h> int main() { WSADATA wsaData; LPHOSTENT host; SOCKET s; SOCKADDR_IN name = { AF_INET } , client; int client_addr=sizeof(SOCKADDR_IN); SOCKADDR_IN addr,addr2; addr.sin_family=AF_INET; addr.sin_port=2048; IN_ADDR ip;//実際と異なるアドレス ip.S_un.S_un_b.s_b1=180; ip.S_un.S_un_b.s_b2=328; ip.S_un.S_un_b.s_b3=9; ip.S_un.S_un_b.s_b4=56; addr.sin_addr=ip; WSAStartup(2 , &wsaData); s = socket(AF_INET , SOCK_STREAM , 0); bind(s , (SOCKADDR *)&addr , sizeof(addr)); listen(s , 1); int sizeaddr2=sizeof(addr2); accept(s , (SOCKADDR *)&addr2 , &sizeaddr2); printf("アクセスがありました\nポート %d : アドレス = %s\n" ,addr.sin_port , inet_ntoa(addr.sin_addr)); shutdown(s , SD_BOTH); closesocket(s); WSACleanup(); getchar(); return 0; } クライエント側 #include <stdio.h> #include <winsock2.h> int main() { while(1) { WSADATA wsaData; SOCKET s; WSAStartup(2 , &wsaData); s = socket(AF_INET,SOCK_STREAM , 0); IN_ADDR ip;//実際と異なるアドレス ip.S_un.S_un_b.s_b1=180; ip.S_un.S_un_b.s_b2=328; ip.S_un.S_un_b.s_b3=9; ip.S_un.S_un_b.s_b4=57; SOCKADDR_IN addr; addr.sin_family=AF_INET; addr.sin_port=2048; addr.sin_addr=ip; connect(s,(PSOCKADDR)&addr,sizeof(SOCKADDR)); send(s,"OK",3,0); shutdown(s , SD_BOTH); closesocket(s); WSACleanup(); } return 0; }

  • winsockを使った通信方法

    送信側 #include <winsock2.h> #include <string.h> int main() { WSAData wsaData; SOCKET sock; struct sockaddr_in addr; int len; typedef struct recv { char Name[32]; int Flag; } RECV; RECV send; WSAStartup(MAKEWORD(2,0), &wsaData); sock = socket(AF_INET, SOCK_DGRAM, 0); addr.sin_family = AF_INET; addr.sin_port = htons(12345); addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); strcat(send.Name, "ABC"); send.Flag=12; len=sizeof(send); sendto(sock,(char *)&send,len, 0, (struct sockaddr *)&addr, sizeof(addr)); closesocket(sock); WSACleanup(); system("pause"); return 0; } 受信側 #include <stdio.h> #include <winsock2.h> #include <string.h> int main() { typedef struct rcv { char Name[32]; int Flag; } RECV; WSAData wsaData; SOCKET sock; struct sockaddr_in addr; int len; RECV rcv; WSAStartup(MAKEWORD(2,0), &wsaData); sock = socket(AF_INET, SOCK_DGRAM, 0); addr.sin_family = AF_INET; addr.sin_port = htons(12345); addr.sin_addr.S_un.S_addr = INADDR_ANY; bind(sock, (struct sockaddr *)&addr, sizeof(addr)); len=sizeof(rcv); recv(sock,(char *)&rcv, len, 0); printf("%s [%d]\n",rcv.Name,rcv.Flag); closesocket(sock); WSACleanup(); system("pause"); return 0; } winsockを使ったUDP通信プログラムで構造体データを送る事が出来ないのですが どこに誤りがあるのでしょうか? コンパイルは通ってるのですが、送信側を起動しても受信側で受け取ることが出来ていない状況です。

  • C言語開発環境について

    このプログラムを実行出来るコンパイラ?あるいは開発環境を紹介して頂けませんか?出来れば無償版がいいです。よろしくお願い致します。 #include <winsock2.h> #pragma comment(lib,"ws2_32.lib") int main() { WSAData wsaData; SOCKET sock; struct sockaddr_in addr; WSAStartup(MAKEWORD(2,0), &wsaData); sock = socket(AF_INET, SOCK_DGRAM, 0); addr.sin_family = AF_INET; addr.sin_port = htons(3054); addr.sin_addr.S_un.S_addr = inet_addr("192.168.0.3"); sendto(sock, "HELLO", 5, 0, (struct sockaddr *)&addr, sizeof(addr)); closesocket(sock); WSACleanup(); return 0; }

  • C言語エラーの解決法教えてください。

    以下のプログラムで6行目にこのようなエラー表示がでてきたのですが、どうすれば良いですか? 1 IntelliSense: 識別子 "WSAData" が定義されていません 2 IntelliSense: 識別子 "wsaData" が定義されていません #include <winsock2.h> #pragma comment(lib,"ws2_32.lib") int main() { WSAData; wsaData; SOCKET sock; struct sockaddr_in addr; WSAStartup(MAKEWORD(2,0), &wsaData); sock = socket(AF_INET, SOCK_DGRAM, 0); addr.sin_family = AF_INET; addr.sin_port = htons(9750); addr.sin_addr.S_un.S_addr = inet_addr("192.168.0.8 "); sendto(sock, "HELLO", 5, 0, (struct sockaddr *)&addr, sizeof(addr)); closesocket(sock); WSACleanup(); return 0; } 教えてください。宜しくお願いします。

  • windows版C++ソケットプログラムエラー

    windows版のC++のソケット通信プログラムです。 server、clientそれぞれのプログラムにおいてエラーがでます。 修正をお願いします。 server側 ・エラー内容 'status' : 定義されていない識別子です。 ・プログラム status = closesocket(dstSocket); break; ・全体プログラム #include <stdio.h> #include <winsock2.h> #include <ws2tcpip.h> #define BUFFER_SIZE 256 int main() { /* ポート番号、ソケット */ unsigned short port = 9876; int srcSocket; // 自分 int dstSocket; // 相手 /* sockaddr_in 構造体 */ struct sockaddr_in srcAddr; struct sockaddr_in dstAddr; int dstAddrSize = sizeof(dstAddr); /* 各種パラメータ */ int numrcv; char buffer[BUFFER_SIZE]; /************************************************************/ /* Windows 独自の設定 */ WSADATA data; WSAStartup(MAKEWORD(2,0), &data); /* sockaddr_in 構造体のセット */ memset(&srcAddr, 0, sizeof(srcAddr)); srcAddr.sin_port = htons(port); srcAddr.sin_family = AF_INET; srcAddr.sin_addr.s_addr = htonl(INADDR_ANY); /* ソケットの生成 */ srcSocket = socket(AF_INET, SOCK_STREAM, 0); /* ソケットのバインド */ bind(srcSocket, (struct sockaddr *) &srcAddr, sizeof(srcAddr)); /* 接続の許可 */ listen(srcSocket, 1); /* 接続の受付け */ printf("Waiting for connection ...\n"); dstSocket = accept(srcSocket, (struct sockaddr *) &dstAddr, &dstAddrSize); printf("Connected from %s\n", inet_ntoa(dstAddr.sin_addr)); /* パケット受信 */ while(1) { numrcv = recv(dstSocket, buffer, BUFFER_SIZE, 0); if(numrcv == 0 || numrcv == -1) { status = closesocket(dstSocket); break;                 ←ここです!!! } printf("received: %s\n", buffer); } /* Windows 独自の設定 */ WSACleanup(); } client側 ・エラー内容 1 'stAddr' : 定義されていない識別子です。 2 '.sin_addr' の左側はクラス、構造体、共用体でなければなりません 3 '.S_un' の左側はクラス、構造体、共用体でなければなりません 4 '.S_addr' の左側はクラス、構造体、共用体でなければなりません 5 'i' : 定義されていない識別子です。 6 'i' : 定義されていない識別子です。 7 'i' : 定義されていない識別子です。 ・プログラム 1~4 stAddr.sin_addr.s_addr = inet_addr(destination); 5~7 for(i=0; i<10; i++) ・全体プログラム #include <stdio.h> #include <winsock2.h> #include <ws2tcpip.h> int main() { /* IP アドレス、ポート番号、ソケット */ char destination[80]; unsigned short port = 9876; int dstSocket; /* sockaddr_in 構造体 */ struct sockaddr_in dstAddr; /* 各種パラメータ */ int status; int numsnt; char *toSendText = "This is a test"; /************************************************************/ /* Windows 独自の設定 */ WSADATA data; WSAStartup(MAKEWORD(2,0), &data); /* 相手先アドレスの入力 */ printf("Connect to ? : (name or IP address) "); scanf("%s", destination); /* sockaddr_in 構造体のセット */ memset(&dstAddr, 0, sizeof(dstAddr)); dstAddr.sin_port = htons(port); dstAddr.sin_family = AF_INET; stAddr.sin_addr.s_addr = inet_addr(destination);                 ←ここです!!! /* ソケット生成 */ dstSocket = socket(AF_INET, SOCK_STREAM, 0); /* 接続 */ printf("Trying to connect to %s: \n", destination); connect(dstSocket, (struct sockaddr *) &dstAddr, sizeof(dstAddr)); /* パケット送出 */ for(i=0; i<10; i++) { ←ここです!!! printf("sending...\n"); send(dstSocket, toSendText, strlen(toSendText)+1, 0); Sleep(1000); } /* Windows 独自の設定 */ closesocket(dstSocket); WSACleanup(); } です。 読みづらいとは思いますがよろしくお願いします(><)

  • 実行ファイルのweb掲載可否

    以下のプログラムの実行ファイルをweb上に載せることはできるのでしょうか? #include <winsock2.h> #pragma comment(lib,"ws2_32.lib") int main() { WSADATA wsaData; SOCKET sock; struct sockaddr_in addr; WSAStartup(MAKEWORD(2, 0), &wsaData); sock = socket(AF_INET, SOCK_DGRAM, 0); addr.sin_family = AF_INET; addr.sin_port = htons(3054); addr.sin_addr.S_un.S_addr = inet_addr("192.168.0.3 "); char data[] = { 0x42, 0x42, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x02, 0x44, 0x33, 0x05 }; sendto(sock, data, 13, 0, (struct sockaddr *)&addr, sizeof(addr)); closesocket(sock); WSACleanup(); return 0; }

専門家に質問してみよう