0

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

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);
4

2 回答 2

0

如果您只处理一个客户端请求然后返回接受循环,那么您可以不用线程/分叉而侥幸逃脱。换句话说,摆脱内部的 while(1) 循环。确保您的客户端打开套接字,发出一个请求,然后关闭套接字(这是 HTTP 1.0 的正常操作)。

这是非常低效的,但它会让你继续前进。

于 2012-07-13T10:24:09.893 回答
0

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

于 2012-07-14T19:37:04.780 回答