网络编程关注的问题
连接的建立
通过三次握手,分两种情况:
1、客户端连接服务器
2、服务器连接第三方服务器
int client = accept(listenfd, addr, sz);
int connectfd = socket(AF_INET, SOCK_STREAM, 0);
int ret = connect(connectfd, (struct sockaddr*)&addr, sizeof(addr));
// 每一次调用socket相关函数,erron都会有相应的变化
errno = EINPROGRESS // 正在建立连接
errno = EISCONN // 连接建立成功
连接的断开
1、主动断开
调用close(),触发四次挥手
2、被动断开
读端关闭:read()返回值为0;
半关闭状态:读端关闭,但写端还可以用,即wirte()还可以用
写端关闭: wirte()返回-1
消息的发送与接收

消息到达
调用int n = read(fd, buf, sz)时,从内核态中读缓冲区读取sz个字节的数据到用户态(即buf中),返回值n为实际读到的数据大小。
// 当read()返回-1的时候,erron可能有以下情况
errno = EWOULDBLOCK; // 内核态中的读缓冲区没有数据
errno = EINRT; // 从内核态读取数据的时候被其他信号打断了,再读一次就可以了
// 当erron出现其他错误的时候,需要调用close(),关闭socket连接
消息发送完毕
调用int n = write(fd, buf, sz);返回值只有两种可能 n = -1 , n = sz;
// 当read()返回-1的时候,erron可能有以下情况
errno = EWOULDBLOCK; // 内核态中的写缓冲区数据满了
errno = EINRT; // 向内核态写数据的时候被其他信号打断了,再写一次就可以了
// 当erron出现其他错误的时候,需要调用close(),关闭socket连接

本文深入探讨了TCP网络编程中的关键概念,包括客户端与服务器间的三次握手建立连接,以及主动和被动断开连接的四次挥手过程。详细阐述了read()和write()函数在消息接收和发送时的错误处理,如EWOULDBLOCK和EINPROGRESS等错误状态,并强调了在出现错误时如何关闭socket连接。

被折叠的 条评论
为什么被折叠?



