这是我写的聊天客户端服务器程序的服务器部分。我创建了一个线程池,服务器必须将连接的客户端与线程相关联。线程函数gestisci()从客户端接收命令并从client1向client2发送消息。但是,一旦我运行它,终端上就没有任何东西出现了。有人能帮助我吗?
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/stat.h>
#include<sys/wait.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<pthread.h>
#define BACKLOG_SIZE 5
#define SA struct sockaddr
void* gestisci_richiesta(void*dati)
int main(int argc, char* argv[]) {
printf("in main function\n");
struct sockaddr_in srv_addr, cl_addr;
int ret, sock, cn_sk, porta, t;
struct argomenti{
int sock_cl,stato;
struct sockaddr_in cl_addr;
int index;}
struct argomenti mess[BACKLOG_SIZE];
int arg_cont[BACKLOG_SIZE];
socklen_t len;
int t_free[BACKLOG_SIZE];
pthread_t tid[BACKLOG_SIZE];
if (argc < 2)
printf("errore:inserire numero porta\n");
porta = atoi(argv[1]);
printf(" %d\n", porta);
sock = socket(PF_INET, SOCK_STREAM, 0);
if (sock == -1) {
printf("server: impossibile creare un nuovo socket.\n");
return 0;
}
memset(&srv_addr, 0, sizeof(srv_addr));
srv_addr.sin_family = AF_INET;
srv_addr.sin_addr.s_addr = htonl(INADDR_ANY );/* il server si mette in ascolto suqualsiasi delle sueinerfacce di rete*/
srv_addr.sin_port = htons(porta);
ret = bind(sock, (SA*) &srv_addr, sizeof(srv_addr));
if (ret == -1) {
printf("server : impossibile eseguire il bind sul socket.\n");
return 0;
}
printf("bind con successo\n");
listen(sock, BACKLOG_SIZE);
for (t = 0; t < BACKLOG_SIZE; t++) {
t_free[t] = 0;
client[t] = 0;
}
t= 0;
while (1) {
while (t_free[t] != 0)
t = (t + 1) % BACKLOG_SIZE;
t_free[t] = 1;
len = (socklen_t) sizeof(mess[t].cl_addr);
cn_sk = accept(sock, (SA*) &mess[t].cl_addr, &len);
mess[t].sock_cl = cn_sk;
mess[t].index = t;
printf("client:%d connesso\n", t);
if (cn_sk == -1) {
printf("SERVER: errore in attesa di connessione\n");
return 0;
}
if (pthread_create(&tid[t], 0, gestisci_richiesta, (void*) &mess[t])) {
printf("server:impossibile avviare un thread dal pool\n");
return 0;
}
}
}
答案 0 :(得分:0)
您在其中几个printfs上缺少\ n,这将导致它们被缓冲而不是立即打印出来。
存在其他问题。您调用socket()的错误消息具有误导性。尚未尝试使用指定的端口。这发生在bind()。没有理由假设客户端数量等于积压大小。 sockaddr_in的大小始终相同:每次都不需要重新计算它。
答案 1 :(得分:0)
您应该在t = 0;
之前移动while(1)
。