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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
あらかた

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

#1

投稿記事 by あらかた » 14年前

現在、初歩的なインターネット通信プログラムを書いていますが、繋がりません。

開発環境
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が応答する
・ファイアウォール、セキュリティソフトを無効にしても症状は変わらない

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

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

#2

投稿記事 by softya(ソフト屋) » 14年前

グローバルアドレスで自分自身に接続することはパケットの仕組み上不可能です。
グローバルアドレスが違う他の人に協力してもらうか、レンタルWEBサーバーに置いた自分のCGIと通信するしかありません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

あらかた

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

#3

投稿記事 by あらかた » 14年前

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

閉鎖

“C言語何でも質問掲示板” へ戻る