问题描述
在大学里,我们的任务是编写一个聊天服务器(IPv6)和一个客户端。它已经工作了,但我有一个问题,即一侧(服务器,客户端)不能一个接一个地发送多条消息,因为例如,服务器必须先接收客户端消息才能发送。我们的教授告诉我们使用 select() 和 ioctl() 函数来解决这个问题,但我不明白这应该如何工作。我必须以什么顺序使用 select()、ioctl() 等?
在我的理解中,select() 会一直监听套接字。一旦客户端发送消息,就会触发选择。但是当gets-function正在等待输入并阻止程序时它不起作用。谢谢你的建议! PS:不允许穿线
服务器代码
while (1) {
FD_ZERO(&fdSet); //fdSet is an Array of Sockets - FD_Zero initalizes them with 0
FD_SET(ListenSocket,&fdSet); //add the socket which listens and awaits connections from client
if (client != INVALID_SOCKET) {
FD_SET(client,&fdSet); // Add client socket also
}
//wait for something to happen on any of the sockets in fdSet,last parameter indicates the timeout (NULL means wait indefinitely)
iResult = select(0,&fdSet,NULL,NULL);
if (iResult == SOCKET_ERROR) {
printf("Error on select.\n");
exit(1);
}
//check,if ListenSocket is in fdSet (fdSet is an Array of Sockets)
if (FD_ISSET(ListenSocket,&fdSet)) {
if (client == INVALID_SOCKET) {
client = accept(ListenSocket,NULL);
printf("New client connection accepted.\n");
//break;
}
}
if (FD_ISSET(client,&fdSet)) {
iResult = recv(client,&message_cli,sizeof(message_cli),0); //read the incoming message from the client
//if recv returns 0,the client has closed the connection
if (iResult == 0 || iResult == SOCKET_ERROR) {
printf("Client %d has disconnected\n",client);
closesocket(client); //close the socket
client = INVALID_SOCKET; //make room for new clients
}
else {
//add null character to printf message in buffer
printf("%s > %s\n",&message_cli.sNumber,&message_cli.txt);
printf("%s > ",&message_serv.sNumber);
gets(&message_serv.txt);
iResult = send(client,&message_serv,sizeof(message_serv),0);
if (iResult == SOCKET_ERROR) {
printf("Send Failed: %d\n",WSAGetLastError());
closesocket(client);
WSACleanup();
exit(1);
}
}
客户端代码
while (1) {
printf("%s> ",&message_cli.sNumber);
gets(&message_cli.txt);
iResult = send(ClientSocket,0);
if (iResult == 0 || iResult == SOCKET_ERROR) {
printf("Server has disconnected.\n");
closesocket(ClientSocket);
WSACleanup();
exit(1);
}
iResult = recv(ClientSocket,0);
if (iResult > 0) {
printf("%s> %s\n",&message_serv.sNumber,&message_serv.txt);
}
}
closesocket(ClientSocket);
WSACleanup();
return 0;
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)