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
使用Select的Socket客户端_C_Sockets_Tcp - Fatal编程技术网

使用Select的Socket客户端

使用Select的Socket客户端,c,sockets,tcp,C,Sockets,Tcp,我正在尝试实现一个客户端功能,它可以使用select()函数与多个服务器建立连接。但我不是使用select()函数的专家。 然而,我的客户端可以启用和多个服务器的连接,但它无法从这些多个服务器读取消息 根据下面的示例,我将客户机与两台服务器连接(192.168.100.136192.168.100.138)。 与这两台服务器连接后,我的客户端只从一台服务器接收消息(192.168.100.136),而不是从多台服务器接收消息 我不确定我在示例程序中使用select()函数的方式。 请更正我的示例

我正在尝试实现一个客户端功能,它可以使用
select()
函数与多个服务器建立连接。但我不是使用
select()
函数的专家。 然而,我的客户端可以启用和多个服务器的连接,但它无法从这些多个服务器读取消息

根据下面的示例,我将客户机与两台服务器连接
(192.168.100.136192.168.100.138)
。 与这两台服务器连接后,我的客户端只从一台服务器接收消息(
192.168.100.136
),而不是从多台服务器接收消息

我不确定我在示例程序中使用
select()
函数的方式。 请更正我的示例应用程序以获得所需的o/p。。 提前谢谢

int main()
{
    int port = 10001 ;
    char ip[][32] = {"192.168.100.136","192.168.100.138"};
    int count = 2 ;
    int ret = clientSelect(ip,port,count);
    return 0 ;
}   
int clientSelect(char **ipAddr ,int port , int count)
    {
    SOCKET max_sd = 0;
    SOCKET socketId[10] = {0};
    SOCKET sd = 0 ;
    SOCKET client_sock[1024] = {0} ;
    fd_set readfds;
    int i ,j , ret;
    char recvBuf[1024] = "";
    char errMsg[256] = "" ;
    struct sockaddr_in server ;

    FD_ZERO(&readfds);
    // Socket Initialization
    for(i = 0; i<count ; i++)
    {
        ret = initSocket(&socketId[i]);//Small function to create socket
        if (ret != 1)
        {
            return ret ;
        }
        //Server info
        server.sin_addr.s_addr  = inet_addr(ipAddr[i]);
        server.sin_family       = AF_INET;
        server.sin_port         = htons(port);
        // Conect to server
        if (connect(socketId[i], (struct sockaddr *)&server , sizeof(server)) < 0)
        {
            printf("connect ::Failed to connect to server %s:%d",ipAddr[i],port);
            return -1;
        }
        // Set Socket fd
        FD_SET(socketId[i], &readfds); 

        max_sd = (max_sd>socketId[i])?max_sd:socketId[i];
    }
    while(TRUE)
    {
        ret = select(max_sd + 1, &readfds, NULL, NULL, NULL);
        if (ret < 0)
        {
            printf("select failed\n ");
            return -1;
        }
        for ( j = 0 ; j<max_sd ; j++)
        {
            sd = client_sock[j] ;
            if (FD_ISSET(sd, &readfds)) 
            {
                ret = recv(sd,(char *)recvBuf,sizeof(recvBuf), 0);
                if(ret > 0 )
                {
                    printf("Message received from socket %d : %s\n",sd,recvBuf);
                    send(sd,(char *)recvBuf,strlen(recvBuf),0);
                }
            }
        }
    }

    return ret ;

}
intmain()
{
int端口=10001;
字符ip[][32]={“192.168.100.136”,“192.168.100.138”};
整数计数=2;
int-ret=clientSelect(ip、端口、计数);
返回0;
}   
int clientSelect(字符**ipAddr、int端口、int计数)
{
插座最大值=0;
套接字socketId[10]={0};
插座sd=0;
套接字客户端_sock[1024]={0};
fd_设置读取FDS;
int i,j,ret;
char recvBuf[1024]=“”;
char errMsg[256]=“”;
服务器中的结构sockaddr_;
FD_零(&readfds);
//套接字初始化
对于(i=0;isocketId[i]),max_sd:socketId[i];
}
while(TRUE)
{
ret=select(max_sd+1,&readfds,NULL,NULL,NULL);
如果(ret<0)
{
printf(“选择失败\n”);
返回-1;
}
对于(j=0;j 0)
{
printf(“从套接字%d接收的消息:%s\n”,sd,recvBuf);
发送(sd,(char*)recvBuf,strlen(recvBuf),0);
}
}
}
}
返回ret;
}

每次使用前必须初始化
fd\u集

您的代码应该如下所示:

int clientSelect(char **ipAddr ,int port , int count)
{
    SOCKET max_sd = 0;
    SOCKET socketId[10] = {0};
    SOCKET sd = 0 ;

    fd_set readfds;
    int i ,j , ret;
    char recvBuf[1024] = "";
    char errMsg[256] = "" ;
    struct sockaddr_in server ;

    // Socket Initialization
    for(i = 0; i<count ; i++)
    {
        ret = initSocket(&socketId[i]);//Small function to create socket
        if (ret != 1)
        {
            return ret ;
        }
        //Server info
        server.sin_addr.s_addr  = inet_addr(ipAddr[i]);
        server.sin_family       = AF_INET;
        server.sin_port         = htons(port);
        // Conect to server
        if (connect(socketId[i], (struct sockaddr *)&server , sizeof(server)) < 0)
        {
            printf("connect ::Failed to connect to server %s:%d",ipAddr[i],port);
            return -1;
        }       
    }


    while(TRUE)
    {
        // init fd_set
        FD_ZERO(&readfds); // added by siva to initialize socket descriptors
        for(i = 0; i<count ; i++)
        {
            //FD_ZERO(&readfds); // Commented by siva to avoid initialization for each socket
            FD_SET(socketId[i], &readfds); 
            max_sd = (max_sd>socketId[i])?max_sd:socketId[i];
        }
        ret = select(max_sd + 1, &readfds, NULL, NULL, NULL);
        if (ret < 0)
        {
            printf("select failed\n ");
            return -1;
        }
        // warning: you don't know the max_sd value
        for(i = 0; i<count ; i++)
        {
            sd = socketId[i] ;
            if (FD_ISSET(sd, &readfds)) 
            {
                ret = recv(sd,(char *)recvBuf,sizeof(recvBuf), 0);
                if(ret > 0 )
                {
                    printf("Message received from socket %d : %s\n",sd,recvBuf);
                    send(sd,(char *)recvBuf,strlen(recvBuf),0);
                }
            }
        }
    }

    return ret ;

}
int clientSelect(字符**ipAddr、int端口、int计数)
{
插座最大值=0;
套接字socketId[10]={0};
插座sd=0;
fd_设置读取FDS;
int i,j,ret;
char recvBuf[1024]=“”;
char errMsg[256]=“”;
服务器中的结构sockaddr_;
//套接字初始化

对于(i=0;i未定义的行为。编译器应该抱怨
main
中缺少
clientSelect
的声明。摆脱无意义的睡眠,正确处理
recv()
返回零或-1的情况,并处理
send()
返回-1同上和
strlen(recvBuf)的情况应该是代码> ReT<代码>。不清楚你实际上在问什么?C还是C++?它们是不同的语言。选择一个!我的要求是实现一个客户端函数,用Scice()来连接多个服务器。概念..我试图实现下面的示例应用程序中所示的功能..但我无法获得预期的o/p。我的问题是,我是否以正确的方式实现了我的要求?我知道我在使用select()时在示例程序中犯了一些错误…因此,请指导我解决问题并帮助我获得解决方案@EJPHi,我根据您的建议更改了我的功能…但我仍然只从一台服务器接收消息,而不是从两台服务器接收消息…请进一步指导我以获得预期的o/p…实际上,我的要求是实现一个客户端功能来建立创建与多个服务器的连接&使用select()监视消息事务概念…请纠正我,无论我在示例函数中是否以正确的方式满足要求…@purplepsycho@purplepsycho,我在你的答案中做了一个小的更正,以使事情按预期正常工作…如果我在修改中做了任何错误,请纠正我。谢谢你