クライント、サーバプログラム

解決


ゆっきー  2005-05-25 08:23:44  No: 57546

vc++6 sdk win98です。
winsockAPIでクラインアントプログラム、サーバプログラムをつくって同じパソコン内で
双方を起動した状態だとconnectできたのですが、自宅のデスクトップでサーバ、
ノートでクライアントプログラムを起動してやってみるとなぜだか、connectしません。以下のようにしてるのですが、、なにが原因なんでしょうか??

サーバ(win32アプリ
WSADATA wsaData;
SOCKET server_s;
SOCKET client_s;
struct sockaddr_in server;
struct sockaddr_in client;
int nError;
int nLength;
char data[256];

WSAStartup(MAKEWORD(2,0),&wsaData);
server_s=socket(AF_INET,SOCK_STREAM,0);
memset(&server,'\0',sizeof(server));
server.sin_family=AF_INET;
server.sin_addr.s_addr=htonl(INADDR_ANY);
server.sin_port=htons(5678);
bind(server_s,(struct sockaddr*)&server,sizeof(server));
listen(server_s,3);
nLength=sizeof(client);
client_s=accept(server_s,(struct sockaddr*)&client,&nLength);
send(client_s,"<<connected ok",strlen("<<connected ok"),0);

クライアント(win32コンソールアプリ
WSADATA wsaData;
SOCKET s;
struct sockaddr_in client;
int nError;
char data[256];

WSAStartup(MAKEWORD(2,0),&wsaData);
s=socket(AF_INET,SOCK_STREAM,0);
memset(&client,'\0',sizeof(client));
client.sin_family=AF_INET;
client.sin_addr.s_addr=inet_addr(argv[1]);
client.sin_port=htons(5678);

printf("connecting...\n");
if(connect(s,(struct sockaddr*)&client,sizeof(client))<0){
  printf("connect error\n");
  return 1;
}
nError=recv(s,data,sizeof(data),0);
data[nError]='\0';
printf("%s\n",data);


YuO  2005-05-25 09:21:59  No: 57547

>winsockAPIでクラインアントプログラム、サーバプログラムをつくって同じパソコン内で
>双方を起動した状態だとconnectできたのですが、自宅のデスクトップでサーバ、
>ノートでクライアントプログラムを起動してやってみるとなぜだか、connectしません。以下のようにしてるのですが、、なにが原因なんでしょうか??

原因を調査していないことが一番の問題点だと思います。

>if(connect(s,(struct sockaddr*)&client,sizeof(client))<0){

if (connect(s, (struct sockaddr *)&client, sizeof(client)) == SOCKET_ERROR) {
とした方がよいでしょう。
# または,if (... != 0) {か。

connectに失敗した場合にはSOCKET_ERRORを返す,と定められているのであって,
0未満を返すとは書いていません。
SOCKETがint型という保証はどこにもないので,MSDNに書かれていることにしたがった方がよいです。

http://msdn.microsoft.com/library/en-us/winsock/winsock/connect_2.asp

>    printf("connect error\n");
>    return 1;

connect errorしか出力しないのでは,エラーの原因を特定することはできません。
WSAGetLastError()を呼び出して,原因をちゃんと調査しましょう。


KING・王  2005-05-25 21:22:00  No: 57548

自宅のデスクトップもwin98でしょうか?
一応確認ですが、WinXPSP2ならWindowsファイアウォールによって、
通信がブロックされているようなことはありませんか?
また、同様に、ファイアウォールソフトによってブロックされていませんか?

まず、PINGはとおりますか?
結構、こんなプログラムとは別な部分が問題ではないでしょうか?


ゆっきー  2005-05-26 09:46:58  No: 57549

YuOさん
>原因を調査していないことが一番の問題点だと思います。
その通りでした。connnectの返却値にしろ、エラー番号も調べてなくて
全然自分で原因を調べてませんでした。
10060が返されたので調べたところ、うちのADSLモデムのルータ機能のせいでした。そっちの設定をかえたら、無事できました。ありがとうございました。

KING・王さん
>結構、こんなプログラムとは別な部分が問題ではないでしょうか?
はい、その通りルータでプログラムじゃないとこのせいでした。
ご指摘ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加