我的理解:服务器socket listen 之后,
客户端connect ,但要在服务器accept 之后,客户端connect才会返回(阻塞情况下)测试结果:
服务器只置listen状态,没有accept操作,客户端connect马上返回0(表示成功)
connect返回0,表示告诉客户端,连接已经成功,但似乎....?
当然,服务器与客户端都在同一台机器上操作,不知道有没有影响

解决方案 »

  1.   


    服务器端// Initialize Winsock
    WSADATA wsaData;
    WSAStartup(MAKEWORD(2,2), &wsaData); //-----------------------------------------
    // Create a listening socket bound to a local
    // IP address and the port specified
    ListenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    u_short port = 6000;
    char* ip;
    sockaddr_in service;
    service.sin_family = AF_INET;
    service.sin_port = htons(port);
    /*hostent* thisHost;
    thisHost = gethostbyname("");
    ip = inet_ntoa (*(struct in_addr *)*thisHost->h_addr_list); service.sin_addr.s_addr = inet_addr(ip);*/ service.sin_addr.s_addr = htonl(INADDR_ANY); //-----------------------------------------
    // Bind the listening socket to the local IP address
    // and port number
    bind(ListenSocket, (SOCKADDR *) &service, sizeof(SOCKADDR)); //-----------------------------------------
    // Set the socket to listen for incoming
    // connection requests
    listen(ListenSocket, 1);
    printf("Listening...\n");
        Sleep(100000);    客户端 WSADATA wsaData;
    int iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
    SOCKET ConnectSocket;
    ConnectSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (ConnectSocket == INVALID_SOCKET) 
    {
    return;
    } sockaddr_in clientService; 
    clientService.sin_family = AF_INET;
    clientService.sin_addr.s_addr = inet_addr( "127.0.0.1" );
    clientService.sin_port = htons( 6000 ); int nRet = connect( ConnectSocket, (SOCKADDR*) &clientService, sizeof(clientService) ); if ( nRet == SOCKET_ERROR) {
    DWORD dw = GetLastError();
    return;
    } printf("socket %d connected\n",i);
      

  2.   

    服务器进入Sleep状态之后,
    int nRet = connect( ConnectSocket, (SOCKADDR*) &clientService, sizeof(clientService) );
    都是返回0
      

  3.   

    可能是你的电脑上有另外一个程序使用6000端口,并且接受了你的连接,你应该检查一下你的服务端的程序bind和listen的返回值,是否是成功的。