#include <iostream> #include <unistd.h> #include <cstdlib> #include <arpa/inet.h> #include <sys/socket.h> #include <sys/wait.h> #include <signal.h> #include <string> using namespace std; const int BUFFER_SIZE = 1024; void read_child_proc(int sig) { int status = 0; waitpid(-1, &status, WNOHANG); } int deal_error(string error_msg) { cout << error_msg << endl; return 0; } int main() { // 创建套接字 int ser_sock = socket(PF_INET, SOCK_STREAM, 0); if (ser_sock == -1) { return deal_error("socket() failed"); } // 套接字绑定ip及端口号 sockaddr_in ser_addr; ser_addr.sin_family = AF_INET; ser_addr.sin_addr.s_addr = htonl(INADDR_ANY); ser_addr.sin_port = htons(9999); if (bind(ser_sock, (sockaddr *)&ser_addr, sizeof(ser_addr)) == -1) { close(ser_sock); return deal_error("bind() failed"); } // 开始监听 if (listen(ser_sock, 5) == -1) { close(ser_sock); return deal_error("listen() failed"); } // 注册信号 signal(SIGCHLD, read_child_proc); // 子进程执行结束信号注册,防止僵尸进程产生 signal(SIGINT, exit); // CTRL+C信号注册,退出程序 while(1) { sockaddr_in clnt_addr; socklen_t addr_length = sizeof(clnt_addr); int clnt_sock = accept(ser_sock, (sockaddr *)&clnt_addr, &addr_length); if (clnt_sock == -1) { continue; } cout << "new client connected: " << clnt_sock << endl; pid_t pid = fork(); if (pid < 0) { continue; } else if (pid == 0) { // 子进程 close(ser_sock); char message[BUFFER_SIZE]; int str_len = read(clnt_sock, message, BUFFER_SIZE-1); if (str_len > 0) { message[str_len] = '