根据我从这个帖子得到的答案,我创建了这个:
//Server sock_init(); //from SFL, see http://legacy.imatix.com/html/sfl/ timeout = 50000; serv_sock_input[0] = TCP(1234); serv_sock_input[1] = UDP(9876); input_protocols[0] = "tcp"; input_protocols[1] = "udp"; while (1) { FD_ZERO(&sock_set); for (x = 0; x
int TCP (unsigned short port) { int sock; struct sockaddr_in servAddr; if ((sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) exit(1); memset(&servAddr, 0, sizeof(servAddr)); servAddr.sin_family = AF_INET; servAddr.sin_addr.s_addr = htonl(INADDR_ANY); servAddr.sin_port = htons(port); if (bind(sock, (struct sockaddr *) &servAddr, sizeof(servAddr)) < 0) exit(1); if (listen(sock, 5) < 0) exit(1); return sock; }
int UDP (unsigned short port) { int sock; /* socket to create */ struct sockaddr_in servAddr; /* Local address */ /* Create socket for sending/receiving datagrams */ if ((sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) exit(1); /* Construct local address structure */ memset(&servAddr, 0, sizeof(servAddr)); /* Zero out structure */ servAddr.sin_family = AF_INET; /* Internet address family */ servAddr.sin_addr.s_addr = htonl(INADDR_ANY); /* Any incoming interface */ servAddr.sin_port = htons(port); /* Local port */ /* Bind to the local address */ if (bind(sock, (struct sockaddr *) &servAddr, sizeof(servAddr)) < 0) exit(1); return sock; }
//Client sock_init(); if ((client_sock_output = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) exit(1); memset(&client_addr, 0, sizeof(client_addr)); client_addr.sin_family = AF_INET; client_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); client_addr.sin_port = htons(1234); if (connect(client_sock_output, (struct sockaddr *) &client_addr, sizeof(client_addr)) < 0) exit(1); closesocket(client_sock_output); sock_term();服务器启动时,服务器在
if(select(...))
语句处被阻止.因此,当我运行服务器,然后运行客户端时,客户端连接到服务器(有时在连接之前需要几次运行客户端).然后
if(select...))
声明不再是真的,它继续前进到其他地方.之后,客户端关闭连接和程序.但是,这就是我的问题发生的地方,
if(select(...))
语句总是错误的.我得到这个输出:Request on port 0: Input TCP Port 0 Request on port 1: Input UDP Port 1此输出将永远重复.为什么它不会卡在
if(select(...))
?
1> 小智..:您有两个问题:您不了解accept()如何在TCP中工作,您需要读取UDP中的传入数据.
select()告诉你一个监听套接字有连接接受,或者读取套接字有要读取的数据.
要让select停止告诉您,您需要实际读取数据或接受连接.
在UDP分支中,您需要调用receiv来实际获取数据.如果不这样做,选择会一直告诉您有数据.
在TCP分支中,调用accept_socket.我不知道你的实现是什么,但是关闭你刚刚调用accept()的套接字可能是错误的.accept()为您返回一个新的套接字 - 您应该用于IO的套接字.如果需要关闭任何东西,那就是新的套接字.