我写了一对非常简单的socket服务器端和客户端,代码如下。先启动服务端再启动客户端。
可是一连上,两端就报错,send error和recv error.这是为什么呢? 高人帮忙教一下哈!服务端:
int _tmain(int argc, _TCHAR* argv[])
{
    WSADATA wsa;
    if(0!=WSAStartup(MAKEWORD(2,2),&wsa))return 1;
    SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);//IPPROTO_TCP和0的区别在哪里?
    if(sockSrv==INVALID_SOCKET)return 1;
    SOCKADDR_IN sAddr;
    sAddr.sin_family=AF_INET;
    sAddr.sin_port  =htons(34567);
    sAddr.sin_addr.S_un.S_addr =htonl(INADDR_ANY);
    if(SOCKET_ERROR == bind( sockSrv, (LPSOCKADDR)&sAddr, sizeof( SOCKADDR )))return 1;
    if(SOCKET_ERROR == listen(sockSrv,0))return 1;//backlog的作用是什么?
    int cbAddr = sizeof(SOCKADDR);
    while(1){
        SOCKET hAccSocket = accept(sockSrv, (SOCKADDR*)&sAddr, &cbAddr );
        if(hAccSocket==INVALID_SOCKET)return 1;
        printf("Accepted!\n");
        while(1){
            if(SOCKET_ERROR == send(sockSrv,"Hi",3,0) ){
                printf("send error\n");
                break;
            }
            printf("data sent\n");
        }
        closesocket(hAccSocket);
    }
    WSACleanup();
return 0;
}
客户端:
int _tmain(int argc, _TCHAR* argv[])
{
    WSADATA wsaData;
    if(0!=WSAStartup(MAKEWORD(2,2), &wsaData ))return 1;
    SOCKET hClient=socket(AF_INET,SOCK_STREAM,0);
    if(hClient==INVALID_SOCKET)return 1;
    SOCKADDR_IN sAddr;
    sAddr.sin_family=AF_INET;
    sAddr.sin_port  =htons(34567);
    sAddr.sin_addr.S_un.S_addr =inet_addr("127.0.0.1");
    if( SOCKET_ERROR==connect( hClient, (LPSOCKADDR)&sAddr, sizeof(SOCKADDR) ) )return 1;
    while(1){
        char buf[10]={0};
        if(0>=recv(hClient,buf,10,0)){
            printf("recv error\n");
            break;
        }
        printf("received %s\n",buf);
        Sleep(5000);
    }
    closesocket(hClient);
    WSACleanup();
return 0;
}

解决方案 »

  1.   

    int _tmain(int argc, _TCHAR* argv[])
    {
        WSADATA wsa;
        if(0!=WSAStartup(MAKEWORD(2,2),&wsa))return 1;
        SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);//IPPROTO_TCP和0的区别在哪里?
        if(sockSrv==INVALID_SOCKET)return 1;
        SOCKADDR_IN sAddr;
        sAddr.sin_family=AF_INET;
        sAddr.sin_port  =htons(34567);
        sAddr.sin_addr.S_un.S_addr =htonl(INADDR_ANY);
        if(SOCKET_ERROR == bind( sockSrv, (LPSOCKADDR)&sAddr, sizeof( SOCKADDR )))return 1;
        if(SOCKET_ERROR == listen(sockSrv,0))return 1;//backlog的作用是什么?
        int cbAddr = sizeof(SOCKADDR);
        while(1){
            SOCKET hAccSocket = accept(sockSrv, (SOCKADDR*)&sAddr, &cbAddr );
            if(hAccSocket==INVALID_SOCKET)return 1;
            printf("Accepted!\n");
            while(1){
                if(SOCKET_ERROR == send(sockSrv,"Hi",3,0) ){  ////这句是干什么用的?                printf("send error\n");
                    break;
                }
                printf("data sent\n");
            }
            closesocket(hAccSocket);      }
        WSACleanup();
        return 0;
    }
      

  2.   

    服务器端发的太快了,Sleep一下
      

  3.   

    if(SOCKET_ERROR == send(hAccSocket,"Hi",3,0) ){
      

  4.   


    楼主的服务器程序在收到连接后将套接字转让到hAccSocket 后,就应该用hAccSocket 进行数据交换。所以
    if(SOCKET_ERROR == send(sockSrv,"Hi",3,0) )应该改为if(SOCKET_ERROR == send(hAccSocket ,"Hi",3,0) )
      

  5.   

    if(SOCKET_ERROR == send(sockSrv,"Hi",3,0) ){
                    printf("send error\n");
                    break;
    第一个参数应该是accept函数返回的hAccSocket句柄,而不是监听SOCKET句柄
      

  6.   

    客户端和服务器Sleep的时间应该差不多