服务器如何存储客户端的IP地址?

3
我使用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)收集到一个向量中。 - fatihk
1个回答

4

您可以将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,_Traits,_Ax>::push_back':无法将参数 1 从 'std::basic_string<_Elem,_Traits,_Ax>' 转换为 'char'。 - user2478375
请检查一下您 push_back 函数的拼写。 - zsawyer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接