Skip to content

Commit aa57b1e

Browse files
committed
简单的回射代码
1 parent 2ee4c76 commit aa57b1e

File tree

5 files changed

+96
-23
lines changed

5 files changed

+96
-23
lines changed

muduo/unp/README.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
## UNP
2+
3+
记录细碎的知识点
4+
5+
### TCP客户/服务器程序示例
6+
网络连接的一些边界问题
7+
8+
1. 客户和服务器启动时候发生了什么?
9+
2. 客户正常终止时发生了什么?
10+
3. 若服务器进程在客户之前终止,客户会发生什么?
11+
4. 若服务器主机崩溃,则客户发生什么?
12+
13+

muduo/unp/byteorder.c

Lines changed: 0 additions & 23 deletions
This file was deleted.

muduo/unp/daytimetcp/server.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,9 @@ int main(int argc, char **argv) {
6767
// 返回值是和参数3一致的如果不一样说明出错
6868
if (write(connfd, buff, sizeof(buff)) != sizeof(buff))
6969
err_sys("write error");
70+
71+
// 当调用close函数的时候 close函数尝试发送已排队等待发送到对端的数据 发送完毕后是正常的TCP的四次挥手
72+
// 当调用close函数的时候 只有对应的socket 描述符的引用计数为0时 才会引发四次挥手
7073
if (close(connfd) == -1)
7174
err_sys("close error");
7275
}

muduo/unp/tcpcliser/tcpcli01.c

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
#include "unp.h"
2+
3+
int main(int argc, char **argv) {
4+
int sockfd;
5+
struct sockaddr_in servaddr;
6+
if(argc != 2){
7+
err_quit("usage: tcpcli <IPaddress>");
8+
}
9+
10+
sockfd = Socket(AF_INET, SOCK_STREAM, 0);
11+
bzero(&servaddr, sizeof(servaddr));
12+
servaddr.sin_family = AF_INET;
13+
servaddr.sin_port = htons(SERV_PORT);
14+
Inet_pton(AF_INET, argv[1], &servaddr.sin_addr);
15+
16+
if(connect(sockfd, (struct sockaddr*) &servaddr, sizeof(servaddr))<0) {
17+
err_sys("connect error");
18+
}
19+
20+
str_cli(stdin, sockfd);
21+
22+
exit(0);
23+
}

muduo/unp/tcpcliser/tcpserv01.c

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
#include "unp.h"
2+
3+
void str_echo_local(int sockfd) {
4+
ssize_t n;
5+
char buf[MAXLINE];
6+
again:
7+
// 如果客户端关闭连接 那么接收到客户端的FIN将导致read的返回值n=0,进而导致函数返回
8+
while((n=read(sockfd, buf, MAXLINE))>0) {
9+
Write(sockfd, buf, n);
10+
}
11+
12+
if(n < 0 && errno == EINTR) {
13+
goto again;
14+
} else if (n < 0) {
15+
err_sys("read error");
16+
}
17+
}
18+
19+
int main(int argc, char **argv) {
20+
int listenfd, connfd;
21+
pid_t childpid;
22+
socklen_t clilen;
23+
struct sockaddr_in servaddr, cliaddr;
24+
25+
if((listenfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
26+
err_sys("socket error");
27+
}
28+
bzero(&servaddr, sizeof(servaddr));
29+
servaddr.sin_family = AF_INET;
30+
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
31+
servaddr.sin_port = htons(SERV_PORT);
32+
33+
if(bind(listenfd, (struct sockaddr *) &servaddr, sizeof(servaddr)) < 0){
34+
err_sys("bind error");
35+
}
36+
37+
if(listen(listenfd, LISTENQ)<0) {
38+
err_sys("listen error");
39+
}
40+
41+
for(;;) {
42+
clilen = sizeof(cliaddr);
43+
connfd = accept(listenfd, (struct sockaddr *) &cliaddr, &clilen);
44+
45+
if((childpid = fork()) == 0) {
46+
if(close(listenfd)<0) {
47+
err_sys("listen error");
48+
}
49+
str_echo_local(connfd);
50+
exit(0);
51+
}
52+
53+
if(close(connfd)<0) {
54+
err_sys("close error");
55+
}
56+
}
57+
}

0 commit comments

Comments
 (0)