Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.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()没有响应?_C_Sockets_Network Programming - Fatal编程技术网

select()没有响应?

select()没有响应?,c,sockets,network-programming,C,Sockets,Network Programming,我的程序的目标是使用select管理多个套接字。然而,我想先用一个插座试试。现在,我面临的问题是,最初客户机向服务器发送数据,服务器接收并显示数据,但当客户机再次发送一些数据时,服务器代码仍保留在select命令中 下面是一些片段,可以让您了解我是如何初始化套接字的 if((master_socket = socket(PF_INET, SOCK_STREAM, 0)) < 0) { exit(1); } if((bind(master_socket,

我的程序的目标是使用select管理多个套接字。然而,我想先用一个插座试试。现在,我面临的问题是,最初客户机向服务器发送数据,服务器接收并显示数据,但当客户机再次发送一些数据时,服务器代码仍保留在select命令中

下面是一些片段,可以让您了解我是如何初始化套接字的

if((master_socket = socket(PF_INET, SOCK_STREAM, 0)) < 0)
    {
      exit(1);
    }

    if((bind(master_socket, (struct sockaddr *)&req, sizeof(req))) < 0)
    {
      exit(1);
    }

    listen(master_socket, 5);
    FD_SET(master_socket,&listening);

    /* wait for connection, then receive and print text */
    len = sizeof(struct sockaddr);
    while(1)
     {
            FD_ZERO(&listening);  //Flush out everything in socket
        FD_SET(master_socket,&listening); // Add master
        if(f_client>0)           // Add client if any
        {
            FD_SET(f_client,&listening);
        }
        printf("Checking for new connection \n");
           //Timeout is null, so waiting indefinitely
        rc = select(FD_SETSIZE, &listening, NULL, NULL, NULL);

     if (FD_ISSET(master_socket, &listening))
        {
          printf("Master side invoked\n");
          if((f_client = accept(master_socket, (struct sockaddr *)&req, &len)) < 0)
          {
             exit(1);
              }
            }

    else if (FD_ISSET(f_client,&listening))
    {
         if ((valread = read( f_client , buf, 1024)) == 0)
         {
            close(f_client);
            f_client=0;
         }
         else
         {
            fputs(buf, stdout);  
         }

    }
if((主套接字=套接字(PF\u INET,SOCK\u STREAM,0))<0)
{
出口(1);
}
if((bind(master_socket,(struct sockaddr*)&req,sizeof(req)))<0)
{
出口(1);
}
监听(主控插座,5);
FD_设置(主_插座和监听);
/*等待连接,然后接收并打印文本*/
len=sizeof(结构sockaddr);
而(1)
{
FD_ZERO(&侦听);//清除套接字中的所有内容
FD_集(主插槽和侦听);//添加主
if(f_client>0)//添加客户端(如果有)
{
FD_集(f_客户端和侦听);
}
printf(“检查新连接\n”);
//超时为空,因此无限期等待
rc=select(FD_SETSIZE,&监听,NULL,NULL,NULL);
中频(FD_ISSET(主插座和监听))
{
printf(“主端调用\n”);
if((f_client=accept(master_socket,(struct sockaddr*)&req,&len))<0)
{
出口(1);
}
}
else if(FD_ISSET(f_客户端和侦听))
{
if((valread=read(f_client,buf,1024))==0)
{
关闭(f_客户端);
f_client=0;
}
其他的
{
FPUT(buf、标准输出);
}
}
}

基本上,在上面的程序中,它连接到服务器,为客户端维护一个文件描述符并添加它。在每一轮中,它都会清除套接字,添加主套接字和客户端套接字(如果有),然后进行检查。这里的问题是,第一次它工作,但第二次当客户端发送一些数据时。它挂起
rc=select(FD_SETSIZE,&监听,NULL,NULL,NULL)

我不明白这里出了什么问题。有人能帮忙吗

     if ((valread = read( f_client , buf, 1024)) == 0)
     {
        close(f_client);
        f_client=0;
     }
     else
     {
        fputs(buf, stdout);  
     }
这个密码坏了。
fputs
函数只能与C样式字符串一起使用。您只是拥有没有特定结构的任意数据。由于忽略了
valread
,因此也不知道读取了多少字节。(想想看,
fputs
怎么可能知道要输出多少字节?这些信息只存在于
valread
中,而您不传递这些信息。)

你已经收到了数据,这个坏代码就把它扔掉了。如果您记录
valread
,您将看到在调用
选择挂起的
之前,您实际上已经在上次调用
read
时读取了它

您可以使用如下内容,而不是
fputs

for (int i = 0; i < valread; ++i)
   putchar(buf[i]);
for(int i=0;i
这个密码坏了。
fputs
函数只能与C样式字符串一起使用。您只是拥有没有特定结构的任意数据。由于忽略了
valread
,因此也不知道读取了多少字节。(想想看,
fputs
怎么可能知道要输出多少字节?这些信息只存在于
valread
中,而您不传递这些信息。)

你已经收到了数据,这个坏代码就把它扔掉了。如果您记录
valread
,您将看到在调用
选择挂起的
之前,您实际上已经在上次调用
read
时读取了它

您可以使用如下内容,而不是
fputs

for (int i = 0; i < valread; ++i)
   putchar(buf[i]);
for(int i=0;i
对不起。。我会编辑的。。它应该是master_socketFix你的缩进,看起来像你的
,否则如果fd_isset(f_client)
不是缩进显示的级别。你的代码一次只能处理一个客户端。现在,是的。但是一个客户端应该能够随时发送消息,对100%确认它卡在
select
中,100%确认
f_client
不是零,100%确认代码没有读取数据。对不起。。我会编辑的。。它应该是master_socketFix你的缩进,看起来像你的
,否则如果fd_isset(f_client)
不是缩进显示的级别。你的代码一次只能处理一个客户端。现在,是的。但是一个客户端应该能够随时发送消息,对100%确认它卡在
select
,100%确认
f_client
不是零,100%确认代码没有读取数据。这是不可能的。。数据输出(第一次)后,返回“检查新连接”并在select等待。。然后我从客户端发送一些数据,但它不会移动。作为客户端,您使用的是什么?(无论如何,你一定要修复这个bug。这将是你遇到的下一个问题。)我会修复它。。作为客户,您使用的是什么意思?比如说什么联系。。TCP!很抱歉,我不明白你的问题,你说“然后我从客户那里发送一些数据”。你说的这个“客户”是什么?这是你写的一个程序?它是工具吗?你是如何确认它确实发送了任何东西的?谢谢!你的问题解决了我的问题:)谢谢你的建议。。非常感谢。那是不可能的。。数据输出(第一次)后,返回“检查新连接”并在select等待。。然后我从客户端发送一些数据,但它不会移动。作为客户端,您使用的是什么?(无论如何,你一定要修复这个bug。这将是你遇到的下一个问题。)我会修复它。。作为客户,您使用的是什么意思?比如说什么联系。。TCP!对不起,我不明白这个问题,你说“那么我从clien那里发送了一些数据