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

时间:2013-06-12 12:55:22

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

我使用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());
                        }
                    }
                }

1 个答案:

答案 0 :(得分: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
相关问题