Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets 套接字连接失败,telnet正常_Sockets_Routing - Fatal编程技术网

Sockets 套接字连接失败,telnet正常

Sockets 套接字连接失败,telnet正常,sockets,routing,Sockets,Routing,我的问题是,我无法通过套接字(windows xp和windows 7)连接两台计算机,尽管使用套接字创建的服务器正在侦听,我可以远程登录它。它接收信息并执行应该执行的操作,但如果运行相应的套接字客户端,则会出现错误10061。而且我在防火墙后面-这两台计算机在我的局域网内运行,windows防火墙关闭 比较1: 192.168.1.2 端口12345 比较2: 192.168.1.5 端口12345 路由器: 192.168.1.1 也许港口转运能帮上忙?但对我来说最重要的是,如果telne

我的问题是,我无法通过套接字(windows xp和windows 7)连接两台计算机,尽管使用套接字创建的服务器正在侦听,我可以远程登录它。它接收信息并执行应该执行的操作,但如果运行相应的套接字客户端,则会出现错误10061。而且我在防火墙后面-这两台计算机在我的局域网内运行,windows防火墙关闭

比较1: 192.168.1.2 端口12345

比较2: 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;
    }

给我们看看你的代码。您可能没有在某处调用htons(),或者其他类似的错误。10061“连接被拒绝”,因此IP或端口在某个地方出错。

您的代码有几个缺陷<代码>如果(bytesRecv==0 | | bytesRecv==WSAECONNRESET){没有意义。bytesRecv为零表示EOS,没有问题,如果有重置,bytesRecv将为-1,WSA errno thing包含
WSAECONNRESET
。您在上面发布了两个IP地址,并且您的代码尝试连接到第三个。查看。谢谢,代码中的IP是可以的-我在主题描述中犯了错误-现在它是正确的。感谢您指出如果(bytesRecv==0 | | bytesRecv==WSAECONNRESET){-我会查看它,但这不是这个特定错误10061的原因,因为客户端程序的输出表明它从未到达这一行-错误在connect()中:PS C:\Users\Piter\documents\vs2010\projects\client\u socket\debug>/client\u socket.exe客户端:WSAStartup()正常。客户端:socket()正常。客户端:connect()-连接失败。连接函数失败,错误为:10061 PS C:\Users\Piter\documents\vs2010\projects\client\u socket\debug>
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