Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets 检查特定客户端(具有ip1,端口1)是否连接到套接字?_Sockets_Udp_Ip - Fatal编程技术网

Sockets 检查特定客户端(具有ip1,端口1)是否连接到套接字?

Sockets 检查特定客户端(具有ip1,端口1)是否连接到套接字?,sockets,udp,ip,Sockets,Udp,Ip,这是一个基于UDP的基本客户机-服务器程序。如果客户端1发送数据,客户端2将接收数据,反之亦然 address.sin_family = AF_INET; address.sin_addr.s_addr = INADDR_ANY; address.sin_port = htons( PORT ); //bind the socket to localhost port 1902 if (bind(master_socket, (struct sockaddr *)&address, s

这是一个基于UDP的基本客户机-服务器程序。如果客户端1发送数据,客户端2将接收数据,反之亦然

address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons( PORT );

//bind the socket to localhost port 1902
if (bind(master_socket, (struct sockaddr *)&address, sizeof(address))<0) 
{
    perror("bind failed");
    exit(EXIT_FAILURE);
}
printf("Listener on port %d \n", PORT);


if (listen(master_socket, 3) < 0)
{
    perror("listen");
    exit(EXIT_FAILURE);
}

//accept the incoming connection
addrlen = sizeof(address);
puts("Waiting for connections ...");

while(TRUE) 
{
    //clear the socket set
    FD_ZERO(&readfds);

    //add master socket to set
    FD_SET(master_socket, &readfds);
    max_sd = master_socket;

    //add child sockets to set
    for ( i = 0 ; i < max_clients ; i++) 
    {
        //socket descriptor
        sd = client_socket[i];

        //if valid socket descriptor then add to read list
        if(sd > 0)
            FD_SET( sd , &readfds);

        //highest file descriptor number, need it for the select function
        if(sd > max_sd)
            max_sd = sd;
    }

    //wait for an activity on one of the sockets , timeout is NULL , so wait indefinitely
    activity = select( max_sd + 1 , &readfds , NULL , NULL , NULL);

    if ((activity < 0) && (errno!=EINTR)) 
    {
        printf("select error");
    }

    //If something happened on the master socket , then its an incoming connection
    if (FD_ISSET(master_socket, &readfds)) 
    {
        if ((new_socket = accept(master_socket, (struct sockaddr *)&address, (socklen_t*)&addrlen))<0)
        {
            perror("accept");
            exit(EXIT_FAILURE);
        }

        //inform user of socket number - used in send and receive commands
        printf("New connection , socket fd is %d , ip is : %s , port : %d \n" , new_socket , inet_ntoa(address.sin_addr) , ntohs(address.sin_port));

    ....
    ....
    //what has to be done here to check a client with IP1, Port 1 is already connected? //
    ....
    ....
    }

    }

在这条消息之后,我想检查是否连接了具有IP1端口1的特定客户端?例如,检查ip 127.0.0.1和端口44852的客户端是否已连接?如果已连接打印,则所需的客户端已可用。有人能给我建议一个方法吗?

应该很清楚怎么做。您正在列表中存储客户端信息。因此,只需在列表中循环检查accept报告的ip/端口是否已经在列表中,如果没有,则添加它。只要确保每当客户端断开连接时,列表都是最新的。

您说过您使用的是UDP,但此代码是针对TCP的。不能将侦听和接受与UDP一起使用。
New connection , socket fd is 4 , ip is : 127.0.0.1 , port : 44851 
Welcome message sent successfully
Adding to list of sockets as 0
New connection , socket fd is 5 , ip is : 127.0.0.1 , port : 44852 
Welcome message sent successfully
Adding to list of sockets as 1