在C中模拟无缓冲的基于回合的套接字通信

问题描述 投票:0回答:1

我编写了一款回合制游戏(单线程,一个客户端到一个服务器,并利用非阻塞 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
            }
        }
c sockets networking
1个回答
0
投票

解决此问题的一种方法是调整发送和接收缓冲区的大小。您可以使用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 套接字缓冲

© www.soinside.com 2019 - 2024. All rights reserved.