[英]UNIX Domain socket programming in C, printing issue
我的服务器出现打印问题。 当我在终端上有两个或更多的客户端处于活动状态时,我希望同时进行打印。 但是,我一次只能从一个客户端打印。 关闭客户端后,其他客户端即可自由写入服务器。 我该怎么做才能解决我的问题?
我试图分叉印刷部分,我认为它实际上没有做任何事情。 (只是意识到如果我这样做,那么选择系统调用是一种浪费,我宁愿使用选择系统调用)*编辑
while(TRUE) {
FD_ZERO(&readfds);
FD_SET(socket1, &readfds);
FD_SET(socket2, &readfds);
FD_SET(socket3, &readfds);
select(socket3+1, &readfds, NULL, NULL, NULL);
//add socket1
if(FD_ISSET(socket1, &readfds)) {
if((client_socket1 = accept(socket1, NULL, NULL)) < 0) {
perror("accept1");
exit(EXIT_FAILURE);
}
printf("New Connection\n");
puts("Welcome message1 sent successfully\n");
}
//add socket2
if(FD_ISSET(socket2, &readfds)) {
if((client_socket2 = accept(socket2, (struct sockaddr *)&addr2, (socklen_t*)&addr2)) < 0) {
perror("accept2");
exit(EXIT_FAILURE);
}
printf("New Connection\n");
puts("Welcome message2 sent successfully\n");
}
//add socket 3
if(FD_ISSET(socket3, &readfds)) {
if((client_socket3 = accept(socket3, (struct sockaddr *)&addr3, (socklen_t*)&addr3)) < 0) {
perror("accept3");
exit(EXIT_FAILURE);
}
printf("New Connection\n");
puts("Welcome message3 sent successfully\n");
}
//print from socket 3
while( (ready = read(client_socket3, buffer, sizeof(buffer))) > 0) {
printf("%s\n", buffer);
}
//print from socket 2
while( (ready = read(client_socket2, buffer, sizeof(buffer))) > 0) {
printf("%s\n", buffer);
}
//print from socket 1
while( (ready = read(client_socket1, buffer, sizeof(buffer))) > 0) {
printf("%s\n", buffer);
}
}
您需要将客户端套接字添加到fd_set
并select
语句,然后再尝试从中读取。 另外,您应该使所有套接字都无阻塞。 否则, read
调用将阻塞,直到您获取数据为止。
这是一个快速修复程序,它使用recv
而不是read
来读取套接字,但是带有MSG_DONTWAIT的异步标志。
在您关闭客户端套接字或正确处理错误的任何地方,我都没有看到。 因此,我插入了一些代码作为提示。 另外,直接从套接字“打印”数据缓冲区永远不是一个好主意。 因为您永远不知道收到的数据是否为空终止。 从套接字读取数据后,始终为null终止缓冲区。
更改此代码块:
//print from socket 3
while( (ready = read(client_socket3, buffer, sizeof(buffer))) > 0) {
printf("%s\n", buffer);
}
对此:
while (1)
{
int result;
result = recv(client_socket3, buffer, sizeof(buffer)-1, MSG_DONTWAIT);
if ((result == -1) &&
((errno == EAGAIN) || (errno==EWOULDBLOCK)) )
{
// no more data available, but could be available later
// use the socket with "select" above to wait for more data
}
else if ((result == -1) || (result == 0))
{
// remote close or unrecoverable error
close(client_socket3);
client_socket3=-1;
}
else
{
// null terminate the buffer before printing
buffer[result] = '\0';
printf("%s\n", buffer);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.