2012-03-19 58 views
0

我的問題是,我無法通過套接字(Windows XP和Windows7的)連接兩臺電腦雖與套接字創建的服務器監聽,我可以遠程登錄了。它接收信息並做什麼應該做,但如果我運行相應的套接字客戶端,我得到錯誤10061.此外,我在防火牆後面 - 這兩臺計算機在我的局域網內運行,Windows防火牆關閉,插座連接失敗,遠程登錄OK

COMP1: 192.168.1.2 端口12345

COMP2: 192.168.1.5 端口12345

路由器:192.168.1.1

也許端口轉發,可以幫助?但對我來說最重要的是要回答爲什麼如果Telnet正常工作,套接字會失敗。

客戶端:

int main(){ 
     // Initialize Winsock. 
     WSADATA wsaData; 
     int iResult = WSAStartup(MAKEWORD(2,2), &wsaData); 
     if (iResult != NO_ERROR) 
      printf("Client: Error at WSAStartup().\n"); 
     else 
      printf("Client: WSAStartup() is OK.\n"); 
     // Create a socket. 
     SOCKET m_socket; 
     m_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 

     if (m_socket == INVALID_SOCKET){ 
      printf("Client: socket() - Error at socket(): %ld\n", WSAGetLastError()); 
      WSACleanup(); 
      return 7; 
     }else 
      printf("Client: socket() is OK.\n"); 

     // Connect to a server. 
     sockaddr_in clientService; 

     clientService.sin_family = AF_INET; 
     //clientService.sin_addr.s_addr = inet_addr("77.64.240.156"); 
     clientService.sin_addr.s_addr = inet_addr("192.168.1.5"); 
     //clientService.sin_addr.s_addr = inet_addr("87.207.222.5"); 
     clientService.sin_port = htons(12345); 

     if (connect(m_socket, (SOCKADDR*)&clientService, sizeof(clientService)) == SOCKET_ERROR){ 
      printf("Client: connect() - Failed to connect.\n"); 
      wprintf(L"connect function failed with error: %ld\n", WSAGetLastError()); 
      iResult = closesocket(m_socket); 
      if (iResult == SOCKET_ERROR) 
      wprintf(L"closesocket function failed with error: %ld\n", WSAGetLastError()); 
      WSACleanup(); 
      return 6; 
     } 

     // Send and receive data 
     int bytesSent; 
     int bytesRecv = SOCKET_ERROR; 
     // Be careful with the array bound, provide some checking mechanism 
     char sendbuf[200] = "Client: Sending some test string to server..."; 
     char recvbuf[200] = ""; 

     bytesSent = send(m_socket, sendbuf, strlen(sendbuf), 0); 
     printf("Client: send() - Bytes Sent: %ld\n", bytesSent); 

     while(bytesRecv == SOCKET_ERROR){ 
      bytesRecv = recv(m_socket, recvbuf, 32, 0); 
      if (bytesRecv == 0 || bytesRecv == WSAECONNRESET){ 
       printf("Client: Connection Closed.\n"); 
       break; 
      }else 
       printf("Client: recv() is OK.\n"); 

      if (bytesRecv < 0) 
       return 0; 
      else 
       printf("Client: Bytes received - %ld.\n", bytesRecv); 
     } 
     system("pause"); 
     return 0; 
    } 

服務器:

int main(){ 
WORD wVersionRequested; 
WSADATA wsaData={0}; 
int wsaerr; 

// Using MAKEWORD macro, Winsock version request 2.2 
wVersionRequested = MAKEWORD(2, 2); 
wsaerr = WSAStartup(wVersionRequested, &wsaData); 
if (wsaerr != 0){ 
    /* Tell the user that we could not find a usable WinSock DLL.*/ 
    printf("Server: The Winsock dll not found!\n"); 
    return 0; 
}else{ 
     printf("Server: The Winsock dll found!\n"); 
     printf("Server: The status: %s.\n", wsaData.szSystemStatus); 
} 

/* Confirm that the WinSock DLL supports 2.2.*/ 
/* Note that if the DLL supports versions greater */ 
/* than 2.2 in addition to 2.2, it will still return */ 
/* 2.2 in wVersion since that is the version we  */ 
/* requested.          */ 
if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2){ 
/* Tell the user that we could not find a usable WinSock DLL.*/ 
printf("Server: The dll do not support the Winsock version %u.%u!\n", LOBYTE(wsaData.wVersion), HIBYTE(wsaData.wVersion)); 
     WSACleanup(); 
     return 0; 
}else{ 
     printf("Server: The dll supports the Winsock version %u.%u!\n", LOBYTE(wsaData.wVersion), HIBYTE(wsaData.wVersion)); 
     printf("Server: The highest version this dll can support: %u.%u\n", LOBYTE(wsaData.wHighVersion), HIBYTE(wsaData.wHighVersion)); 
} 
//////////Create a socket//////////////////////// 
//Create a SOCKET object called m_socket. 
SOCKET m_socket; 
// Call the socket function and return its value to the m_socket variable. 
// For this application, use the Internet address family, streaming sockets, and the TCP/IP protocol. 
// using AF_INET family, TCP socket type and protocol of the AF_INET - IPv4 
m_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 

// Check for errors to ensure that the socket is a valid socket. 
if (m_socket == INVALID_SOCKET){ 
    printf("Server: Error at socket(): %ld\n", WSAGetLastError()); 
    WSACleanup(); 
    //return 0; 
}else{ 
    printf("Server: socket() is OK!\n"); 
} 

////////////////bind////////////////////////////// 
// Create a sockaddr_in object and set its values. 
sockaddr_in service; 

// AF_INET is the Internet address family. 
service.sin_family = AF_INET; 
// "127.0.0.1" is the local IP address to which the socket will be bound. 
service.sin_addr.s_addr = htons(INADDR_ANY);//inet_addr("127.0.0.1");//htons(INADDR_ANY); //inet_addr("192.168.1.2"); 
// 55555 is the port number to which the socket will be bound. 
// using the htons for big-endian 
service.sin_port = htons(12345); 

// Call the bind function, passing the created socket and the sockaddr_in structure as parameters. 
// Check for general errors. 
if (bind(m_socket, (SOCKADDR*)&service, sizeof(service)) == SOCKET_ERROR){ 
    printf("Server: bind() failed: %ld.\n", WSAGetLastError()); 
    closesocket(m_socket); 
    //return 0; 
}else{ 
    printf("Server: bind() is OK!\n"); 
} 
// Call the listen function, passing the created socket and the maximum number of allowed 
// connections to accept as parameters. Check for general errors. 
if (listen(m_socket, 1) == SOCKET_ERROR) 
     printf("Server: listen(): Error listening on socket %ld.\n", WSAGetLastError()); 
else{ 
    printf("Server: listen() is OK, I'm waiting for connections...\n"); 
} 

// Create a temporary SOCKET object called AcceptSocket for accepting connections. 
SOCKET AcceptSocket; 

// Create a continuous loop that checks for connections requests. If a connection 
// request occurs, call the accept function to handle the request. 
printf("Server: Waiting for a client to connect...\n"); 
printf("***Hint: Server is ready...run your client program...***\n"); 
// Do some verification... 
while (1){ 
    AcceptSocket = SOCKET_ERROR; 

     while (AcceptSocket == SOCKET_ERROR){ 
     AcceptSocket = accept(m_socket, NULL, NULL); 
     } 
    // else, accept the connection... note: now it is wrong implementation !!!!!!!! !! !! (only 1 char) 
    // When the client connection has been accepted, transfer control from the 
    // temporary socket to the original socket and stop checking for new connections. 
    printf("Server: Client Connected! Mammamija. \n"); 
    m_socket = AcceptSocket; 
    char recvBuf[200]=""; 
    char * rc=recvBuf; 
    int bytesRecv=recv(m_socket,recvBuf,64,0); 

    if(bytesRecv==0 || bytesRecv==WSAECONNRESET){ 
     cout<<"server: connection closed.\n"; 
     }else{ 
      cout<<"server: recv() is OK.\n"; 
      if(bytesRecv<0){ 
       return 0; 
       }else{ 
        printf("server: bytes received: %ld.\n",recvBuf); 
      } 
    } 

從客戶機的輸出:

PS C:\Users\Piter\documents\vs2010\projects\client_socket\debug> ./client_socket.exe 
Client: WSAStartup() is OK. 
Client: socket() is OK. 
Client: connect() - Failed to connect. 
connect function failed with error: 10061 
PS C:\Users\Piter\documents\vs2010\projects\client_socket\debug> ipconfig 

回答

0

我們展示你的代碼。你可能不是在某處調用htons(),或者是其他類似的錯誤。 10061是'連接被拒絕',因此IP或端口在某處出錯。

+0

我想這是這個原因...... – 4pie0 2012-03-19 01:36:14

+0

你的代碼中有幾個漏洞。 if(bytesRecv == 0 || bytesRecv == WSAECONNRESET){'沒有意義。 bytesRecv爲零表示EOS,不是問題,如果有重置,則bytesRecv將爲-1,WSA errno包含'WSAECONNRESET'。您在上面發佈了兩個IP地址,並且您的代碼嘗試連接到第三個IP地址。評論。 – EJP 2012-03-19 01:51:46

+0

謝謝,代碼中的IP是好的 - 我在主題描述中犯了錯誤 - 現在它是正確的。感謝您指出,如果(bytesRecv == 0 || bytesRecv == WSAECONNRESET){ - 我會看它,但它並不像客戶端程序的輸出此特定錯誤10061的原因表明,它從來就沒有到這個行 - 錯誤是在連接(): – 4pie0 2012-03-19 17:31:37