2012-03-19 57 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