socket编程需要关注的点

网络编程关注的问题

连接的建立

通过三次握手,分两种情况:
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连接
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值