本例在上一例的基礎上增加了singal函式來捕捉子程序退出時候產生的sigchld訊號,從而防止子程序變成殭屍程序。
伺服器端的**如下:
#include #include #include #include #include #include #include #include #include #include #define maxline 4096
#define serv_port 5000
#define listenq 5
void str_echo(int sockfd)
if (write(sockfd, buf, n) < 0)
memset(buf, 0x00, maxline);
} if (n < 0 && errno != eintr) }}
void sig_chld(int signo)
}int main(int argc, char **argv)
memset(&servaddr, 0x00, sizeof(servaddr));
servaddr.sin_family = af_inet;
servaddr.sin_addr.s_addr = htonl(inaddr_any);
servaddr.sin_port = htons(serv_port);
if (bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0)
if (listen(listenfd, listenq) < 0)
signal(sigchld, sig_chld);
for(;;)
if ((childpid = fork()) == 0)
str_echo(connfd);
exit(0);
} if (close(connfd) < 0)
}}
客戶端**如下:
#include #include #include #include #include #include #include #define serv_port 5000
#define maxline 4096
void str_cli(file *fp, int sockfd)
if (write(sockfd, sendline, strlen(sendline)) < 0)
if (read(sockfd, recvline, maxline) == 0)
if (fputs(recvline, stdout) == eof)
memset(sendline, 0x00, maxline);
memset(recvline, 0x00, maxline);
} if ((write(sockfd, quit_code, strlen(quit_code))) < 0)
}int main(int argc, char **argv)
if ((sockfd = socket(af_inet, sock_stream, 0)) < 0)
memset(&servaddr, 0x00, sizeof(servaddr));
servaddr.sin_family = af_inet;
servaddr.sin_port = htons(serv_port);
if (inet_pton(af_inet, argv[1], &servaddr.sin_addr) < 0)
if (connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0)
str_cli(stdin, sockfd);
exit(0);
}
TCP網路程式設計之echo回射程式
tcp網路程式設計有三個例子最值得學習研究,分別是echo chat proxy,都是長連線協議。接下來,把這幾個例子都實現。本節用乙個簡單的例子來講tcp客戶 伺服器程式框架,這也是echo的實現。程式的基本流程 客戶從標準輸入鍵入一行文字,並傳送給伺服器。伺服器接收到文字之後回射給客戶端。客戶端...
TCP 回射程式
客戶端從標準輸入讀入一行文字,並發給伺服器 伺服器從網路輸入讀入這行文字,並且回射給客戶 客戶從網路輸入讀入這行回射文字,並且顯示在標準輸出上。伺服器從網路讀入和返回 void str echo int sockfd while 1 int main 父程序中關閉已連線套接字 close connf...
用select實現TCP回射程式(伺服器及客戶端)
該程式系參考 unp 來編寫的,主要用來練習select及shutdown函式的使用。伺服器 include include include include include include include include include include include define port 888...