【问题标题】:how can a server store the client's ip address?服务器如何存储客户端的IP地址?
【发布时间】:2013-06-08 14:22:55
【问题描述】:

我使用 c++ 在 tcp 中创建了一个服务器和客户端应用程序。客户端只是向服务器发送一条消息。 在代码中,服务器在控制台中显示有关客户端的一些信息: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());
                        }
                    }
                }

【问题讨论】:

  • 你可以将 inet_ntoa(SenderInfo.sin_addr) 收集到一个向量中

标签: c++ visual-studio tcp client-server


【解决方案1】:

您可以将 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

【讨论】:

  • 好的,我尝试了该代码并得到了这个错误:错误 C2664: 'std::basic_string<_elem>::push_back' : cannot convert parameter 1 from 'std::basic_string<_elem>' 到 'char'
  • 请检查push_back的拼写。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-10
  • 2020-04-16
相关资源
最近更新 更多