gpt4 book ai didi

c - 无需多线程套接字的多个连接

转载 作者:行者123 更新时间:2023-11-30 17:59:25 24 4
gpt4 key购买 nike

我的客户端/服务器地址簿有问题。当我连接第一个客户端时,一切都很好。之后,服务器接受来自其他客户端的其他连接,但它不响应任何请求(添加数字等...)我该怎么办?谢谢

int optval;
socklen_t optlen = sizeof(optval);
char choice[MAX];
char buff[MAX]; /* dati di invio e ricezione */
char buff1[MAX];
char buffNome[MAX];
char buffCognome[MAX];
char buffTelefono[MAX];
char buffMail[MAX];
struct sockaddr_in server_addr; /* indirizzo del server */
struct sockaddr_in client_addr; /* indirizzo del client */
int sd_server, sd_client; /* i socket descriptor usati per identificare server e client */


if((sd_server = socket(AF_INET, SOCK_STREAM, 0)) < 0)
printf("Errore nella creazione del server\n");





optval = 1;
optlen = sizeof(optval);
if(setsockopt(sd_server, SOL_SOCKET, SO_REUSEADDR, &optval, optlen) < 0) {
perror("setsockopt()");
close(sd_server);
exit(EXIT_FAILURE);
}

server_addr.sin_family = AF_INET; /* la famiglia dei protocolli */
server_addr.sin_port = htons(1745); /* la porta in ascolto */
server_addr.sin_addr.s_addr = INADDR_ANY; /* dato che è un server bisogna associargli l'indirizzo della macchina su cui sta girando */


if(bind(sd_server, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0)
printf("Errore di binding\n");




listen (sd_server, 20);

int address_size = sizeof(client_addr);

struct elemento *lista = NULL;
struct elementoutente *listautente = NULL;

while (1) {
if((sd_client = accept(sd_server, (struct sockaddr *)&client_addr, &address_size)) < 0)
printf("Errore nella chiamata accept\n");




while(1){

.... CODE.....


}
close(sd_server);

最佳答案

将调用accept的监听套接字设置为非阻塞。使所有连接的客户端套接字也成为非阻塞的。在所有这些套接字上使用顶级 select/poll/epoll。每当连接的套接字上有事件,或者客户端正在等待连接监听套接字时,您都会收到通知。处理该通知。这是一种仅使用一个进程的有效方法,无需为单独的客户端处理程序进入 fork 或多线程。

关于c - 无需多线程套接字的多个连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11468530/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com