開発環境
OS:Windows XP SP3 32bit
IDE:Visual Studio 2008
プロバイダー:au
回線:KDDI光
以下が通信プログラムです。
/*クライアント処理スレッド*/
DWORD CALLBACK client(void *a) {
SOCKET s=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addr;
memset(&addr,0,sizeof(addr));
addr.sin_addr.S_un.S_addr=inet_addr((char *)a);
addr.sin_family=AF_INET;
addr.sin_port=htons(12000);
connect(s,(sockaddr *)&addr,sizeof(addr));
int e=WSAGetLastError();//e=10061
closesocket(s);
return 0;
}
/*サーバ処理*/
int main(int argc, char* argv[])
{ WSADATA wsa;
WSAStartup(MAKEWORD(2,0),&wsa);
char buf[50]="";
if(GetWANIP(buf)<0) goto end;
puts(buf); //bufにはPCのグローバルIPが入ります
SOCKET s=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addr;
memset(&addr,0,sizeof(addr));
addr.sin_addr.s_addr=INADDR_ANY;
addr.sin_family=AF_INET;
addr.sin_port=htons(12000);
char yes=1;
setsockopt(s,0,SO_REUSEADDR,(char *)&yes,sizeof(yes));
bind(s,(sockaddr *)&addr,sizeof(addr));
listen(s,5);
DWORD id;
CreateThread(0,0,client,buf,0,&id);
int l=sizeof(addr);
SOCKET n=accept(s,(sockaddr *)&addr,&l);
closesocket(s);
closesocket(n);
Sleep(10000);
end:;
WSACleanup();
return 0;
}
アドレスは取得できたのですが、client関数内のconnectでエラー10061を吐きます。connect以外ではエラーは吐いていません。
又acceptではブロックしたままです。
思いついた原因はすべて確認したつもりですが、どうしたら良いか見当がつきません。
皆様のご教授よろしくお願いします。
調べたこと
・IPアドレス(main内のbuf文字列)をグローバルでなくローカルアドレスにすると正常にうごく
・ルーターの設定では12000ポートに関するフィルタはなかった
・http://www.akakagemaru.info/port/tcppor ... cceptが応答する
・ファイアウォール、セキュリティソフトを無効にしても症状は変わらない