#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <unistd.h>\n#include <sys/types.h>\n#include <sys/socket.h>\n#include <netinet/in.h>\n#include <netinet/tcp.h>\n\n#define PORT 8080\n#define BUFFER_SIZE 1024\n\nint main() {\n int sockfd, newsockfd;\n struct sockaddr_in server_addr, client_addr;\n socklen_t client_len;\n char buffer[BUFFER_SIZE];\n\n // 创建套接字\n sockfd = socket(AF_INET, SOCK_STREAM, 0);\n if (sockfd < 0) {\n perror("Error opening socket");\n exit(1);\n }\n\n // 禁用Nagle算法\n int flag = 1;\n int result = setsockopt(sockfd, IPPROTO_TCP, TCP_NODELAY, (char *)&flag, sizeof(int));\n if (result < 0) {\n perror("Error setting TCP_NODELAY");\n exit(1);\n }\n\n // 初始化服务器地址结构\n bzero((char *)&server_addr, sizeof(server_addr));\n server_addr.sin_family = AF_INET;\n server_addr.sin_addr.s_addr = INADDR_ANY;\n server_addr.sin_port = htons(PORT);\n\n // 绑定套接字到服务器地址\n if (bind(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {\n perror("Error binding socket");\n exit(1);\n }\n\n // 监听连接请求\n listen(sockfd, 5);\n printf("Server listening on port %d... ", PORT);\n\n while (1) {\n // 接受连接请求\n client_len = sizeof(client_addr);\n newsockfd = accept(sockfd, (struct sockaddr *)&client_addr, &client_len);\n if (newsockfd < 0) {\n perror("Error accepting connection");\n exit(1);\n }\n\n // 读取客户端发送的数据\n bzero(buffer, BUFFER_SIZE);\n ssize_t n = read(newsockfd, buffer, BUFFER_SIZE - 1);\n if (n < 0) {\n perror("Error reading from socket");\n exit(1);\n }\n\n printf("Received message from client: %s ", buffer);\n\n // 发送响应给客户端\n const char *response = "Server received your message";\n n = write(newsockfd, response, strlen(response));\n if (n < 0) {\n perror("Error writing to socket");\n exit(1);\n }\n\n // 关闭连接\n close(newsockfd);\n }\n\n // 关闭套接字\n close(sockfd);\n\n return 0;\n}\n\n在上述代码中,我们使用setsockopt函数禁用了Nagle算法,通过将TCP_NODELAY选项设置为1。这样可以确保数据在发送时不会被缓冲,从而减少延迟。\n\n请注意,为了简化代码,我们省略了错误处理的细节。在实际使用中,应该对每个系统调用的返回值进行检查,并根据需要采取适当的错误处理措施。


原文地址: https://www.cveoy.top/t/topic/pxYr 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录