C等待消息到达套接字
我想构建一个程序,其中两个进程使用AF_UNIX套接字相互交换消息。具体地说,客户机有一个循环,其中创建了一个20个整数的数组,并等待一个随机时间,然后将该数组发送给服务器;服务器有一个循环,它在其中等待20个整数的数组,然后打印接收的数据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]=
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条“消息”需要读取多少字节)我建议您在什么基础上声明允许服务器忽略消息?请注意,为此目的,如何创建套接字很重要,因此您省略这些细节的决定对您没有好处。