2012-01-10 23 views
1

私には問題があります。 私は標準のサーバーとクライアントをWindowsソケットで作成していますが、それは自分のPCで正常に動作します(サーバーを実行してクライアントを接続すると接続します)が、サーバーがコンピュータ上で動作しているときにも動作させる方法はわかりません私の友人(彼はサーバーの部分を実行する)とクライアントは私のPC上で開始されます。 彼のIPアドレス:192.168.1.6 私のIPアドレス:192.168.1.2 自分のマシンで動作しているサーバーアプリケーションに接続できないのはなぜですか? それは動作するはずですか?私は接続を確立するだけでなく、他のsthを行う必要がありますか?ソケット:クライアントが他のコンピュータ/サーバに接続できません

サーバー:



    // 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

+0

sockaddr_inとlengthポインタパラメータを渡さずに "accept"を呼び出すことができませんでした。ちょうどMSDNをチェックして、大丈夫と思われる。面白い。 – selbie

答えて

1

は、お使いのコンピュータに移動し、コマンドプロンプトから実行し、友人のコンピュータ上でサーバーを実行してみましょう:

telnet 192.168.1.6 55555 

それがまったく接続するかどうかを確認してください。そうでない場合、問題はお客様のクライアントコードではありません。ルーティングまたはファイアウォールの問題の可能性を考慮してください。

+0

申し訳ありませんがIPで間違いを犯しました。現在は正しいです:IP:192.168.1.6 私のIP:192.168.1.2 – 4pie0

+0

私は自分のサーバを稼働できません。後でもう一度試してみます。十分な? – 4pie0

+0

ピング出力:Badanie 192.168.1.6 Zuľyciem32bajt˘wdanych: Odpowied«Z 192.168.1.6:bajt˘w= 32 czas = 1msのTTL = 128 Odpowied«Z 192.168.1.6:bajt˘w = 32 czas = 1msのTTL = 128 Odpowied«Z 192.168.1.6:bajt˘w= 32 czas = 1msのTTL = 128 Odpowied«Z 192.168.1.6:bajt˘w= 32 czas = 1msのTTL = 128 Statystyka badaniaピングDLA 192.168.1.6: Pakiety:Wysane = 4、Odebrane = 4、Utracone = 0(0%straty)、 Szacunkowy czas B 最小値= 1 ms、最大値= 1 ms、Czas redni = 1 ms – 4pie0

関連する問題