本文共 1823 字,大约阅读时间需要 6 分钟。
1.实现一个多进程的并发服务器
#include#include #include #include #include #include #include #include #include #include #define SERV_IP "192.168.0.2"#define SERV_PORT 8888void wait_child(int signo) { while (waitpid(0, NULL, WNOHANG) > 0) { return; } return;}int main() { pid_t pid; int lfd, cfd; struct sockaddr_in serv_addr, cli_addr; socklen_t cli_addr_len; char buf[BUFSIZ]; int n, i, ret; lfd = socket(AF_INET, SOCK_STREAM, 0); if (lfd == -1) { perror("socket error"); exit(1); } bzero(&serv_addr, sizeof(serv_addr)); serv_addr.sin_family = AF_INET; serv_addr.sin_port = htons(SERV_PORT); //serv_addr.sin_addr.s_addr = inet_pton(AF_INET, SERV_IP, &serv_addr.sin_addr.s_addr); serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); ret = bind(lfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)); if (ret == -1) { perror("bind error"); exit(1); } ret = listen(lfd, 128); if (ret == -1) { perror("listen error"); exit(1); } while (1) { cli_addr_len = sizeof(cli_addr); cfd = accept(lfd, (struct sockaddr *)&cli_addr, &cli_addr_len); if (cfd == -1) { perror("accept error"); exit(1); } printf("client IP:%s,port:%d\n", inet_ntop(AF_INET, &cli_addr.sin_addr.s_addr, cli_IP, sizeof(cli_IP)), ntohs(cli_addr.sin_port)); pid = fork(); if (pid < 0) { perror("fork error"); exit(1); } else if (pid == 0) { close(lfd); while (1) { n = read(cfd, buf, sizeof(buf)); if (n == 0) { close(cfd); return 0; } else if (n == -1) { perror("read error"); exit(1); } else { for (i = 0; i < n; i++) { if (buf[i] == '\n') { buf[i] = '\0'; } } } } } }}
改写说明:
转载地址:http://sulzk.baihongyu.com/