2013-06-12 134 views
3

我使用C++在tcp中创建了一个服务器和客户端应用程序。客户端只是向服务器发送消息。 代码服务器显示有关控制台的客户端的一些信息:IP地址,端口等 我希望服务器存储客户端的IP地址,因为不同的应用程序,然后将要访问此列表服务器如何存储客户端的IP地址?

怎么能我存储连接到服务器的所有客户端的IP地址? 服务器代码:

WSADATA wsaData; 
     SOCKET ListeningSocket, NewConnection; 
     SOCKADDR_IN ServerAddr, SenderInfo; quantity 
     int Port = 7171; 
     char recvbuff[1024]; 
     int ByteReceived, i, nlen; 

     ListeningSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 
     if (ListeningSocket == INVALID_SOCKET) 
     { 
      printf("Server: Error at socket, error code: %ld.\n", WSAGetLastError()); 
      WSACleanup(); 
      return 1; 
     } 

     ServerAddr.sin_family = AF_INET; 
     ServerAddr.sin_port = htons(Port); 
     ServerAddr.sin_addr.s_addr = htonl(INADDR_ANY); 

     if (bind(ListeningSocket, (SOCKADDR *)&ServerAddr, sizeof(ServerAddr)) == SOCKET_ERROR) 
     { 
      printf("Server: bind failed! Error code: %ld.\n", WSAGetLastError()); 
      closesocket(ListeningSocket); 
      WSACleanup(); 
      return 1; 
     } 

     if (listen(ListeningSocket, 5) == SOCKET_ERROR) 
     { 
      printf("Server: listen: Error listening on socket %ld.\n", WSAGetLastError()); 
      closesocket(ListeningSocket); 
      WSACleanup(); 
      return 1; 
     } 
     else 
     { 
      printf("Server: listening for connections...\n\n"); 
     } 

     while(1) 
     { 
      NewConnection = SOCKET_ERROR; 
       while(NewConnection == SOCKET_ERROR) 
       { 
        NewConnection = accept(ListeningSocket, NULL, NULL); 
        printf("Server: New client got connected, ready to receive and send data...\n\n"); 
        ByteReceived = recv(NewConnection, recvbuff, sizeof(recvbuff), 0); 

        if (ByteReceived > 0) 
        { 
         getsockname(ListeningSocket, (SOCKADDR *)&ServerAddr, (int *)sizeof(ServerAddr)); 
         printf("Server: IP(s) used by Server: %s\n", inet_ntoa(ServerAddr.sin_addr)); 
         printf("Server: port used by Server: %d\n\n", htons(ServerAddr.sin_port)); 
         memset(&SenderInfo, 0, sizeof(SenderInfo)); 
         nlen = sizeof(SenderInfo); 
         getpeername(NewConnection, (SOCKADDR *)&SenderInfo, &nlen); 
         printf("Server: IP used by Client: %s\n", inet_ntoa(SenderInfo.sin_addr)); 
         printf("Server: Port used by Client: %d\n", htons(SenderInfo.sin_port)); 
         printf("Server: Bytes received: %d\n", ByteReceived); 
         printf("Server: Message from client: \""); 

         for(i=0;i < ByteReceived;i++) 
         { 
          printf("%c", recvbuff[i]); 
         } 
         printf("\""); 
         } 
         else if (ByteReceived == 0) 
         { 
          printf("Server: Connection closed!\n"); 
         } 
         else 
         { 
          printf("Server: recv failed with error code: %d\n", WSAGetLastError()); 
         } 
        } 
       } 
+0

你可以只收集INET_NTOA(SenderInfo.sin_addr)为载体 –

+0

我怎么做? – user2478375

回答

3

你可以只收集INET_NTOA(SenderInfo.sin_addr)为矢量:

WSADATA wsaData; 
     SOCKET ListeningSocket, NewConnection; 
     SOCKADDR_IN ServerAddr, SenderInfo; quantity 
     int Port = 7171; 
     char recvbuff[1024]; 
     int ByteReceived, i, nlen; 

     ListeningSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 
     if (ListeningSocket == INVALID_SOCKET) 
     { 
      printf("Server: Error at socket, error code: %ld.\n", WSAGetLastError()); 
      WSACleanup(); 
      return 1; 
     } 

     ServerAddr.sin_family = AF_INET; 
     ServerAddr.sin_port = htons(Port); 
     ServerAddr.sin_addr.s_addr = htonl(INADDR_ANY); 

     if (bind(ListeningSocket, (SOCKADDR *)&ServerAddr, sizeof(ServerAddr)) == SOCKET_ERROR) 
     { 
      printf("Server: bind failed! Error code: %ld.\n", WSAGetLastError()); 
      closesocket(ListeningSocket); 
      WSACleanup(); 
      return 1; 
     } 

     if (listen(ListeningSocket, 5) == SOCKET_ERROR) 
     { 
      printf("Server: listen: Error listening on socket %ld.\n", WSAGetLastError()); 
      closesocket(ListeningSocket); 
      WSACleanup(); 
      return 1; 
     } 
     else 
     { 
      printf("Server: listening for connections...\n\n"); 
     } 
     std::vector<std::string> vClientIPs; // client ip string vector 
     while(1) 
     { 
      NewConnection = SOCKET_ERROR; 
       while(NewConnection == SOCKET_ERROR) 
       { 
        NewConnection = accept(ListeningSocket, NULL, NULL); 
        printf("Server: New client got connected, ready to receive and send data...\n\n"); 
        ByteReceived = recv(NewConnection, recvbuff, sizeof(recvbuff), 0); 

        if (ByteReceived > 0) 
        { 
         getsockname(ListeningSocket, (SOCKADDR *)&ServerAddr, (int *)sizeof(ServerAddr)); 
         printf("Server: IP(s) used by Server: %s\n", inet_ntoa(ServerAddr.sin_addr)); 
         vClientIPs.push_back(std::string(inet_ntoa(ServerAddr.sin_addr))); //insert client ip 
         printf("Server: port used by Server: %d\n\n", htons(ServerAddr.sin_port)); 
         memset(&SenderInfo, 0, sizeof(SenderInfo)); 
         nlen = sizeof(SenderInfo); 
         getpeername(NewConnection, (SOCKADDR *)&SenderInfo, &nlen); 
         printf("Server: IP used by Client: %s\n", inet_ntoa(SenderInfo.sin_addr)); 
         printf("Server: Port used by Client: %d\n", htons(SenderInfo.sin_port)); 
         printf("Server: Bytes received: %d\n", ByteReceived); 
         printf("Server: Message from client: \""); 

         for(i=0;i < ByteReceived;i++) 
         { 
          printf("%c", recvbuff[i]); 
         } 
         printf("\""); 
         } 
         else if (ByteReceived == 0) 
         { 
          printf("Server: Connection closed!\n"); 
         } 
         else 
         { 
          printf("Server: recv failed with error code: %d\n", WSAGetLastError()); 
         } 
        } 
       } 
       WRITE_IP_SOMEWHERE(vClientIPs); // you can write this string vector to a file or database 
+0

好吧我试过这段代码,并得到这个错误:错误C2664:'std :: basic_string <_Elem,_Traits,_Ax> :: push_back':无法将参数1从'std :: basic_string <_Elem,_Traits,_Ax>'转换为'char' – user2478375

+0

@ user2478375,对不起,编辑答案 –

+0

请检查您的拼写'push_back'。 – zsawyer

相关问题