• 締切済み

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

クライエントプログラムを起動もしていないのに、アクセスがありましたと表示されます。 どこが悪いのか教えてくださいませんでしょうか? サーバー側 #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; }

みんなの回答

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.1

>accept(s , (SOCKADDR *)&addr2 , &sizeaddr2); acceptに失敗した場合は? 戻り値をちゃんとチェックしましょう。

thulala
質問者

お礼

回答ありがとうございます。 socket(AF_INET,SOCK_STREAM,0)で検索したら、 サンプルソースがありました。 以下のような感じでできました。 ///-----------Server------------------/// #include<stdio.h> #include<winsock2.h> //ws2_32.lib int main() { WSADATA wsaData; WSAStartup(2,&wsaData); SOCKET Soc; SOCKET Sok; sockaddr_in Server; sockaddr_in Client; int Length=sizeof(Client); Server.sin_family=AF_INET; Server.sin_port=9000; Server.sin_addr.S_un.S_addr=htonl(INADDR_ANY); Soc=socket(AF_INET,SOCK_STREAM,0); bind(Soc,(struct sockaddr *)&Server,sizeof(Server)); char Str[128]; listen(Soc,5); Sok=accept(Soc,(struct sockaddr *)&Client,&Length); if(Sok<0) { printf("Accept error\n"); closesocket(Soc); closesocket(Sok); WSACleanup(); return -1; } while(1) { int Len=recv(Sok,Str,sizeof(Str),0); if(Len<0){printf("ReceiveError");break;} Str[Len]='\0'; printf("%s\n",Str); } closesocket(Soc); closesocket(Sok); WSACleanup(); return 0; } ///-----------Client------------------/// #include<stdio.h> #include<winsock2.h> //ws2_32.lib int main() { WSADATA wsaData; WSAStartup(2,&wsaData); SOCKET Soc; struct sockaddr_in Client; Client.sin_family=AF_INET; Client.sin_port=9000; Client.sin_addr.S_un.S_addr=inet_addr("192.168.1.15"); Soc=socket(AF_INET,SOCK_STREAM,0); if(connect(Soc,(struct sockaddr *)&Client,sizeof(Client))<0) { printf("ConnectError"); closesocket(Soc); WSACleanup(); return -1; } else { printf("Connection OK\n"); } while(1) { char Str[128]; gets(Str); if(strcmp("exit",Str)==0){return 0;} if(send(Soc,Str,strlen(Str),0)<0) { printf("SendError"); break; } } closesocket(Soc); WSACleanup(); return 0; }

関連するQ&A