Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.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

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
C等待消息到达套接字_C_Sockets - Fatal编程技术网

C等待消息到达套接字

C等待消息到达套接字,c,sockets,C,Sockets,我想构建一个程序,其中两个进程使用AF_UNIX套接字相互交换消息。具体地说,客户机有一个循环,其中创建了一个20个整数的数组,并等待一个随机时间,然后将该数组发送给服务器;服务器有一个循环,它在其中等待20个整数的数组,然后打印接收的数据 cilent: int fd=CreateSocketClient(); int *a=calloc(20, sizeof(int)); int i, j; while(1){ for(i=0; i<20; i++) a[i]=

我想构建一个程序,其中两个进程使用AF_UNIX套接字相互交换消息。具体地说,客户机有一个循环,其中创建了一个20个整数的数组,并等待一个随机时间,然后将该数组发送给服务器;服务器有一个循环,它在其中等待20个整数的数组,然后打印接收的数据

cilent:
int fd=CreateSocketClient();
int *a=calloc(20, sizeof(int));
int i, j;
while(1){
    for(i=0; i<20; i++)
        a[i]=rand()%20;
    j=rand()%1000
    Client_sleep(j);
    send(fd, a, 20, 0);
}


server:
 int fd=CreateSocketServer();
int *a=calloc(20, sizeof(int));
int ;
while(1){
    WaitForMessage(fd);
    recv(fd, a, 20, 0);
    for(i=0; i<20; i++)
        printf("%d ", a[i]);
}
cilent:
int fd=CreateSocketClient();
int*a=calloc(20,sizeof(int));
int i,j;
而(1){

对于(i=0;i对于具有阻塞套接字的单个客户端服务器
WaitForMessage
recv
调用。对于具有非阻塞套接字的多客户端服务器
WaitForMessage
选择
,或
epoll
,或您的平台提供的任何内容,请参阅以获取更多详细信息

然而,
recv
必须重复调用,以不断填充接收缓冲区,直到它包含至少一条完整的消息

接收者需要一种方法来检测完整的消息,规范的方法是:

  • 每条消息都有一个固定大小的标题作为前缀,它告诉您要接收的确切消息大小
  • 每条消息都以字节序列终止(例如,对于没有有效负载的HTTP消息,
    \r\n\r\n
    )。继续读取套接字,直到检测到消息终止序列

  • 你是在问如何等到正好有20条“消息”到达?除了尝试从套接字读取外,无法推断是否有20条“消息”存在。阻塞套接字上的
    recv
    将阻塞,直到它可以读取为止。因此,如果使用阻塞套接字,则在循环上执行
    recv
    ,直到读取20个字节(或者20条“消息”需要读取多少字节)我建议您在什么基础上声明允许服务器忽略消息?请注意,为此目的,如何创建套接字很重要,因此您省略这些细节的决定对您没有好处。