据我了解,积压决定了连接队列的大小。此时此大小的任何额外请求都将被删除(此规则是否正确?)。
现在我有一个非常简单的程序 server.c
socket()
bind()
listen(..., 5)
while(1)
{
accept()
read()
write()
sleep(3)
close()
}
现在,我一次启动8个客户端 以连接到此服务器。令人惊讶的是,服务器服务于所有8个客户端,但它应该只排队5个客户端和其余3个客户请求应被拒绝。另一个有趣的观点是,即使我将此积压值设为0,结果仍然相同。然后我尝试评论listen()调用,所有8个客户端连接被拒绝。
有人可以就此提供任何意见。
答案 0 :(得分:3)
backlog参数是关于队列大小的提示。所以你不能指望它做你想要的。
这answer似乎涵盖了它。
更多信息,来自我的Ubuntu系统上的listen(2)手册页的引用:
backlog参数定义sockfd的挂起连接队列可能增长的最大长度。如果队列已满时连接请求到达, 客户端可能会收到带有ECONNREFUSED指示的错误,或者,如果底层协议支持重传,则可以忽略该请求以便稍后 在连接时重新尝试成功。
请注意,它在任何地方都说“可能”。
答案 1 :(得分:0)
我做过男人听我的系统&得到以下描述:
说明
listen()将sockfd引用的套接字标记为被动套接字,即作为套接字使用accept(2)接受传入的连接请求。 sockfd参数是一个文件描述符,它引用SOCK_STREAM或SOCK_SEQPACKET类型的套接字。 backlog参数定义sockfd的挂起连接队列可能增长的最大长度。如果在队列已满时到达连接请求,则客户端可能会收到带有ECONNREFUSED指示的错误,或者,如果基础协议支持重新传输,则可以忽略该请求,以便稍后在连接时重新尝试成功。
答案 2 :(得分:0)
Server.c
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <sys/un.h>
#include <unistd.h>
int main()
{
int server_sockfd, client_sockfd;
int server_len, client_len;
struct sockaddr_un server_address;
struct sockaddr_un client_address;
unlink(“server_socket”);
server_sockfd = socket(AF_UNIX, SOCK_STREAM, 0);
server_address.sun_family = AF_UNIX;
strcpy(server_address.sun_path, “server_socket”);
server_len = sizeof(server_address);
bind(server_sockfd, (struct sockaddr *)&server_address, server_len);
listen(server_sockfd, 5);
while(1)
{
char ch;
printf(“server waiting\n”);
client_len = sizeof(client_address);
client_sockfd = accept(server_sockfd,(struct sockaddr *)&client_address, &client_len);
read(client_sockfd, &ch, 1);
ch++;
write(client_sockfd, &ch, 1);
sleep(3);
close(client_sockfd);
}
}
Client.c
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/un.h>
#include <unistd.h>
int main()
{
int sockfd;
int len;
struct sockaddr_un address;
int result;
char ch = ‘A’;
sockfd = socket(AF_UNIX, SOCK_STREAM, 0);
address.sun_family = AF_UNIX;
strcpy(address.sun_path, “server_socket”);
len = sizeof(address);
result = connect(sockfd, (struct sockaddr *)&address, len);
if(result == -1)
{
perror(“oops: client1”);
exit(1);
}
write(sockfd, &ch, 1);
read(sockfd, &ch, 1);
printf(“char from server = %c\n”, ch);
close(sockfd);
exit(0);
}