From d764264edf7beb2ec6a47aa5ab327e25425c209f Mon Sep 17 00:00:00 2001 From: ningling <2907616355@qq.com> Date: Wed, 10 May 2023 03:15:05 +0000 Subject: [PATCH] update 6/server.c. Signed-off-by: ningling <2907616355@qq.com> --- 6/server.c | 150 +++++++++++++++++++++++++++++------------------------ 1 file changed, 81 insertions(+), 69 deletions(-) diff --git a/6/server.c b/6/server.c index 5350de0..2174022 100644 --- a/6/server.c +++ b/6/server.c @@ -1,71 +1,83 @@ -#include -#include -#include -#include -#include -#include -#include -#include - -#define MYPORT 8887 - - -#define ERR_EXIT(m) - do { - perror(m); - exit(EXIT_FAILURE); - } while (0) - -void echo_ser(int sock) -{ - char recvbuf[1024] = {0}; - struct sockaddr_in peeraddr; - socklen_t peerlen; - int n; - - while (1) - { - - peerlen = sizeof(peeraddr); - memset(recvbuf, 0, sizeof(recvbuf)); - n = recvfrom(sock, recvbuf, sizeof(recvbuf), 0, - (struct sockaddr *)&peeraddr, &peerlen); - if (n <= 0) - { - - if (errno == EINTR) - continue; - - ERR_EXIT("recvfrom error"); - } - else if(n > 0) - { - printf("接收到的数据:%s\n",recvbuf); - sendto(sock, recvbuf, n, 0, - (struct sockaddr *)&peeraddr, peerlen); - printf("回送的数据:%s\n",recvbuf); - } - } - close(sock); +#include +#include +#include +#include +#include +#include +#include +#include + +int fileFd, server_sock; + +void sigint_handler(int signal) { + puts("\nserver get Ctrl+C, finished!"); + close(fileFd); + close(server_sock); + exit(130); } - -int main(void) -{ - int sock; - if ((sock = socket(PF_INET, SOCK_DGRAM, 0)) < 0) - ERR_EXIT("socket error"); - - struct sockaddr_in servaddr; - memset(&servaddr, 0, sizeof(servaddr)); - servaddr.sin_family = AF_INET; - servaddr.sin_port = htons(MYPORT); - servaddr.sin_addr.s_addr = htonl(INADDR_ANY); - - printf("监听%d端口\n",MYPORT); - if (bind(sock, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) - ERR_EXIT("bind error"); - - echo_ser(sock); - - return 0; + +int main() { + // 注册信号处理函数 + if (signal(SIGINT, sigint_handler) == SIG_ERR) { + perror("signal"); + return -1; + } + // 创建套接字 + server_sock = socket(AF_INET, SOCK_DGRAM, 0);//TCP/IP – IPv4,UDP流 + if (server_sock == -1) { + perror("socket error!"); + return -1; + } + // 设置服务器地址 + struct sockaddr_in server_address; + memset(&server_address, 0, sizeof(server_address)); + server_address.sin_family = AF_INET; + server_address.sin_addr.s_addr = htonl(INADDR_ANY);//调用默认IP + server_address.sin_port = htons(9999);//字节序转换,绑定端口号9999 + // 绑定套接字 + if (bind(server_sock, (struct sockaddr *)&server_address, + sizeof(server_address)) == -1) { + perror("bind error!"); + return -1; + } + // 打开 log 文件 + fileFd = open("log.txt", O_RDWR | O_CREAT | O_APPEND, 0600); + while (1) { + // 接受客户端连接 + struct sockaddr_in client_address; + socklen_t client_address_size = sizeof(client_address); + // 接收数据 + char buffer[1024]; + int length = + recvfrom(server_sock, buffer, sizeof(buffer), 0, + (struct sockaddr *)&client_address, &client_address_size); + if (length == -1) { + perror("recv error!"); + return -1; + } + // 创建子进程来处理 client_sock + int ret = fork(); + if (ret == 0) { + // 写入本地文件 + char str[1024 + 100]; + memset(str, 0, 1024); + sprintf(str, "message: %s, size: %lu\n", buffer, strlen(buffer)); + write(fileFd, str, strlen(str)); + // 发送数据 + if (sendto(server_sock, str, 1024, 0, (struct sockaddr *)&client_address, + client_address_size) == -1) { + perror("send failed!"); + return -1; + } + break; + } else if (ret == -1) { + perror("fork failed"); + return -1; + } else { + continue; + } + } + close(fileFd); + close(server_sock); + return 0; } \ No newline at end of file -- Gitee