ページ 11

ソケットでグローバル通信

Posted: 2011年10月29日(土) 14:07
by あらかた
現在、初歩的なインターネット通信プログラムを書いていますが、繋がりません。

開発環境
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;
}
やろうとしていることは、PCのグローバルアドレスを取得し自分に接続することです。
アドレスは取得できたのですが、client関数内のconnectでエラー10061を吐きます。connect以外ではエラーは吐いていません。
又acceptではブロックしたままです。
思いついた原因はすべて確認したつもりですが、どうしたら良いか見当がつきません。
皆様のご教授よろしくお願いします。

調べたこと
・IPアドレス(main内のbuf文字列)をグローバルでなくローカルアドレスにすると正常にうごく
・ルーターの設定では12000ポートに関するフィルタはなかった
http://www.akakagemaru.info/port/tcppor ... cceptが応答する
・ファイアウォール、セキュリティソフトを無効にしても症状は変わらない

Re: ソケットでグローバル通信

Posted: 2011年10月29日(土) 15:05
by softya(ソフト屋)
グローバルアドレスで自分自身に接続することはパケットの仕組み上不可能です。
グローバルアドレスが違う他の人に協力してもらうか、レンタルWEBサーバーに置いた自分のCGIと通信するしかありません。

Re: ソケットでグローバル通信

Posted: 2011年10月29日(土) 15:52
by あらかた
返信ありがとうございます。
softya(ソフト屋) さんが書きました:グローバルアドレスで自分自身に接続することはパケットの仕組み上不可能です。
それは知りませんでした。一人で焦ってしまって恥ずかしい限りです(_ _)
おっしゃる通り、他のPCからは接続できたのでそうやって開発していきます。