写了个简单的socket服务器/客户端,但客户端connect失败,然后服务端陷入死循环?该怎么解决

写了个简单的socket服务器/客户端,但客户端connect失败,然后服务端陷入死循环?
最简单的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;