2012-01-10 124 views
1

我有一個問題,到目前爲止我不知道如何通過它。 我已經創建了標準的服務器和客戶端通過Windows套接字,它在我的電腦上正常工作(如果我運行服務器,然後運行它們連接的客戶端),但我不知道如何使其工作也服務器在計算機上運行時我的朋友(他運行服務器部分)和客戶端在我的PC上啓動。 他的IP:192.168.1.6 我的IP:192.168.1.2 爲什麼我無法連接到我的服務器應用程序運行在他的機器上? 它應該工作嗎?除了建立連接之外,我還必須做些什麼嗎?套接字:客戶端無法連接到其他電腦/服務器

服務器:



    // C++ from Visual Studio 2008 Pro Edition 
     //#include "stdafx.h" 
     #include 
     #include 
     #include 
     #include 
     //#pragma comment(lib, "ws2_32.lib") //not necessary becouse additional dependency added to linker 
    // Microsoft Development Environment 2003 - Version 7.1.3088 
    // Copyright (r) 1987-2002 Microsoft Corporation. All Right Reserved 
    // Microsoft .NET Framework 1.1 - Version 1.1.4322 
    // Copyright (r) 1998-2002 Microsoft Corporation. All Right Reserved 
    // Run on Windows XP Pro machine, version 2002, SP 2 
    // already included 
    // WINVER = 0x0501 for Xp already defined in windows.h 


    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("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(55555); 

    // 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... 
     // 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!\n"); 
     m_socket = AcceptSocket; 
     break; 
    } 
    system("pause"); 
    return 0; 
    } 

客戶:



    // C++ from Visual Studio 2008 Pro Edition 
     //#include "stdafx.h" 
     #include 
     #include 
     #include 
     #include 
     //#pragma comment(lib, "ws2_32.lib") //not necessary becouse additional dependency added to linker 
     // Microsoft Development Environment 2003 - Version 7.1.3088 
     // Copyright (r) 1987-2002 Microsoft Corporation. All Right Reserved 
     // Microsoft .NET Framework 1.1 - Version 1.1.4322 
     // Copyright (r) 1998-2002 Microsoft Corporation. All Right Reserved 
     // Run on Windows XP Pro machine, version 2002, SP 2 
     // already included 
     // WINVER = 0x0501 for Xp already defined in windows.h 
     // A sample of client program 

     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.6"); 
      clientService.sin_port = htons(55555); 

      if (connect(m_socket, (SOCKADDR*)&clientService, sizeof(clientService)) == SOCKET_ERROR){ 
       printf("Client: connect() - Failed to connect.\n"); 
       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 ... 
      return 0; 
     } 

+1

是你朋友的PC在同一網絡上嗎?如果不是這樣,這些IP就沒用了,並且不能通過互聯網工作。你需要他的外部IP,有網站找出:http://www.whatismyip.com/ – pezcode 2012-01-10 20:49:02

+0

我不知道你可以調用「接受」,而不傳遞一個sockaddr_in和長度指針參數。剛查過MSDN,似乎沒問題。有趣。 – selbie 2012-01-13 10:07:10

回答

1

嘗試運行您的朋友的計算機上的服務器,然後去到您的計算機並運行命令提示符:

telnet 192.168.1.6 55555 

看看它是否連接。如果沒有,那麼問題不在於你的客戶端代碼。考慮路由或防火牆問題的可能性。

+0

對不起,我犯了錯誤的IP,現在它是正確的:他的IP:192.168.1.6 我的IP:192.168.1.2 – 4pie0 2012-01-10 18:22:00

+0

現在我無法運行我的服務器,我稍後再嘗試它,但也許ping是足夠? – 4pie0 2012-01-10 18:27:02

+0

平輸出:Badanie 192.168.1.6žuľyciem32bajt˘wdanych: Odpowied字母«Z 192.168.1.6:bajt˘w= 32 czas = 1毫秒TTL = 128 Odpowied字母«Z 192.168.1.6:bajt˘w = 32個czas = 1毫秒TTL = 128 Odpowied字母«Z 192.168.1.6:bajt˘w= 32 czas = 1毫秒TTL = 128 Odpowied字母«Z 192.168.1.6:bajt˘w= 32 czas = 1毫秒TTL = 128 Statystyka badania平DLA 192.168.1.6: Pakiety:Wysane = 4,Odebrane = 4,Utracone = 0(0%straty) Szacunkowy czas b Ądzeniapakiet˘ww millisekundach: 最小= 1 ms,Maksimum = 1 ms,Czas redni = 1 ms – 4pie0 2012-01-10 18:44:57

相關問題