没有多线程套接字的多个连接

时间:2012-07-13 10:17:51

标签: c sockets tcp addressbook

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

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

2 个答案:

答案 0 :(得分:0)

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

效率很低,但它会帮助你。

答案 1 :(得分:0)

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