我编写了一款回合制游戏(单线程,一个客户端到一个服务器,并利用非阻塞 I/O 来实现回合制方面),该游戏围绕服务器和客户端之间的通信,所有这些都基于 stdout 和 stdin。
一切正常,但我很难做到这一点,因为阻塞 I/O 不允许缓冲。例如,在我的程序中,客户端总是第 1 轮。当客户端移动时,服务器当然仍在运行。服务器可以在终端中输入任意行,客户端将在客户端做出移动后接收它们——本质上是缓冲输入。这并不理想。
出于某种原因,我无法在网上找到很多有关套接字的信息;所以我想知道我是否在某个地方缺少某些功能或功能?
// client code sample:
while (1){
memset(buffer, 0, BUFFER_SIZE);
printf("Enter a message for the server: ");
fgets(buffer, BUFFER_SIZE, stdin);
buffer[strlen(buffer)-1] = '\0';
send(buffer, connfd);
// sending
}
memset(buffer, 0, BUFFER_SIZE);
read(connfd, buffer, BUFFER_SIZE);
// responding
}
// server code sample:
while (1) {
memset(buffer, 0, BUFFER_SIZE);
read(connfd, buffer, BUFFER_SIZE);
// responding since client goes first
// Create msg
char message[BUFFER_SIZE];
while (1) {
memset(message, 0, BUFFER_SIZE);
printf("Enter a message for the client: ");
fgets(message, BUFFER_SIZE, stdin);
message[strlen(message)-1] = '\0';
send(buffer, connfd);
// sending
}
}
解决此问题的一种方法是调整发送和接收缓冲区的大小。您可以使用setsockopt函数来完成此操作,该函数允许您设置套接字选项。具体方法如下:
// 对于服务器(发送者) setsockopt(sock, SOL_SOCKET, SO_SNDBUF, (int[]){YOUR_BUF_LIMIT}, sizeof(int));
// 对于客户端(接收方) setsockopt(sock, SOL_SOCKET, SO_RCVBUF, (int[]){YOUR_BUF_LIMIT}, sizeof(int));
在上面的代码中,将 YOUR_BUF_LIMIT 替换为您要设置的最大缓冲区大小1。
另一种方法是实现自己的缓冲机制。您可以将数据从套接字读取到缓冲区中,然后逐行处理缓冲区。 Python 套接字缓冲