写了个简单的socket服务器/客户端,但客户端connect失败,然后服务端陷入死循环?该怎么解决
写了个简单的socket服务器/客户端,但客户端connect失败,然后服务端陷入死循环?
最简单的socket 通信。我的想法是让客户端连上以后,服务器端给它发送一个"get",然后客户端打印这个字符串,并休眠5s钟时间。在这个过程中,服务器端的send函数应该处于阻塞的状态。
问题是
(1)客户端connect函数失败了----为什么会失败?
(2)然后服务器端就陷入了死循环,为什么会这样?
我的代码到底哪里出了问题?
客户端代码:
服务器端代码:
------解决方案--------------------
客户端:
最简单的socket 通信。我的想法是让客户端连上以后,服务器端给它发送一个"get",然后客户端打印这个字符串,并休眠5s钟时间。在这个过程中,服务器端的send函数应该处于阻塞的状态。
问题是
(1)客户端connect函数失败了----为什么会失败?
(2)然后服务器端就陷入了死循环,为什么会这样?
我的代码到底哪里出了问题?
客户端代码:
- C/C++ code
#include<winsock2.h> #include<windows.h> #pragma comment(lib,"Ws2_32") struct init{ init(){ WORD wWSAVersion; WSADATA wsaData; wWSAVersion = MAKEWORD( 2, 0 ); WSAStartup( wWSAVersion, &wsaData ); } ~init(){WSACleanup();} }my_init; int _tmain(int argc, _TCHAR* argv[]) { int cbAddr = sizeof(SOCKADDR_IN); SOCKADDR_IN sAddr; SOCKET hClient=socket(AF_INET,SOCK_STREAM,0); if(hClient==INVALID_SOCKET){ printf("socket failed\n"); return 1; } sAddr.sin_family=AF_INET; sAddr.sin_port =34567; sAddr.sin_addr.s_addr =inet_addr("127.0.0.1"); if( ! connect( hClient, (LPSOCKADDR)&sAddr, sizeof(sAddr) ) ){ printf("connect failed\n"); return 4; } while(1){ char buf[6]={0}; recv(hClient,buf,6,0); printf("get %s\n",buf); Sleep(5000); } return 0; }
服务器端代码:
- C/C++ code
#include<winsock2.h> #include<windows.h> #pragma comment(lib,"Ws2_32") struct init{ init(){ WORD wWSAVersion; WSADATA wsaData; wWSAVersion = MAKEWORD( 2, 0 ); WSAStartup( wWSAVersion, &wsaData ); } ~init(){WSACleanup();} }my_init; int _tmain(int argc, _TCHAR* argv[]) { int cbAddr = sizeof(SOCKADDR_IN); SOCKADDR_IN sAddr; SOCKET hClient=socket(AF_INET,SOCK_STREAM,0); if(hClient==INVALID_SOCKET)return 1; sAddr.sin_family=AF_INET; sAddr.sin_port =34567; sAddr.sin_addr.s_addr =inet_addr("127.0.0.1"); if(SOCKET_ERROR == bind( hClient, (LPSOCKADDR)&sAddr, sizeof( sAddr ))){ return 2; } if(SOCKET_ERROR == listen(hClient,0)){//backlog的作用? return 3; } SOCKET hAccSocket = accept(hClient, (SOCKADDR*)&sAddr, &cbAddr ); if( hAccSocket == INVALID_SOCKET ) { return 4; } printf("Accepted!\n"); while(1){ send(hClient,"hello",5,0); printf("data sent\n"); } return 0; }
------解决方案--------------------
客户端:
- C/C++ code
if ( connect( hClient, (LPSOCKADDR)&sAddr, sizeof(sAddr) ) == SOCKET_ERROR) { printf( "Failed to connect.\n" ); WSACleanup(); return; }
------解决方案--------------------
客户端同时要修改的部分
- C/C++ code
while(1){ char buf[6]={0}; if(SOCKET_ERROR ==recv(hClient,buf,6,0)) break; printf("get %s\n",buf); Sleep(5000); }
------解决方案--------------------
while(1){
char buf[6]={0};
if(0<recv(hClient,buf,6,0))
break;
printf("get %s\n",buf);
Sleep(5000);
}
------解决方案--------------------
判断失败不是用!来判断的,是用connect( hClient, (LPSOCKADDR)&sAddr, sizeof(sAddr) ) == SOCKET_ERROR)来判断的
------解决方案--------------------
还有就是服务器与客户端代码部分的
sAddr.sin_port =34567;最好就是换成sAddr.sin_port =htons(34567);
然后下面的改在这样才对
while(1){
char buf[6]={0};
if(0>=recv(hClient,buf,6,0))
break;