什么网站做外贸最好,中国卫生健康网官网,wordpress西部,网站导航栏效果1、连接的建立
分为两种#xff1a;服务端处理接收客户端的连接#xff1b;服务端作为客户端连接第三方服务
//作为服务端
int listenfd socket(AF_INET, SOCK_STREAM, 0);
bind(listenfd, (struct sockaddr*)servaddr, sizeof(servaddr)))
listen(listenfd, 10); //…1、连接的建立
分为两种服务端处理接收客户端的连接服务端作为客户端连接第三方服务
//作为服务端
int listenfd socket(AF_INET, SOCK_STREAM, 0);
bind(listenfd, (struct sockaddr*)servaddr, sizeof(servaddr)))
listen(listenfd, 10); //listen(fd, backlog)
int clientfd accept(listenfd, addr, sz);//作为客户端
// 举例为非阻塞io阻塞io成功直接返回0
int connectfd socket(AF_INET, SOCK_STREAM, 0);
int ret connect(connectfd, (struct sockaddr*)addr, sizeof(addr));
// ret -1 errno EINPROGRESS 正在建立连接
// ret -1 errno EISCONN 连接建立成功
TCP在listen时的参数backlog的意义 backlog 表示accept全连接队列的大小也就是三次握手完成后server没有调用accept从 全连接队列 取出连接时连接队列中最大可存放的数量
2、连接的断开
主动断开由于tcp是全双工的连接包含两条通道client的R端 server的W端client的W端 server的R端。client和server都可以主动关闭两条通道的任意一条。close 会同时关闭R端和W端shutdown可以指定关闭某一条通道
// 主动关闭
close(fd);
shutdown(fd, SHUT_RDWR);
// 主动关闭本地读端对端写端关闭
shutdown(fd, SHUT_RD);
// 主动关闭本地写端对端读端关闭
shutdown(fd, SHUT_WR);
被动关闭一端主动关闭后另一端的被动处理可以区分到底是读端关闭了还是写端关闭了以实现半关闭状态
// 被动读端关闭
// 有的网络编程需要支持半关闭状态
int n read(fd, buf, sz);
if (n 0) { close_read(fd); // write() //只是读端关闭了还可以将未发送完成的数据继续发送完成 // close(fd);
}
// 被动写端关闭
int n write(fd, buf, sz);
if (n -1 errno EPIPE) { close_write(fd); // close(fd);
}
EPIPE 错误表示在进行写入操作时写入的目标文件描述符或socket对应的管道被关闭或者在非阻塞模式下写入的目标已经没有足够的空间来接收数据
3、消息的到达
从读缓冲区中读取数据
int n read(fd, buf, sz);
if (n 0) { // n -1if (errno EINTR || errno EWOULDBLOCK)break;close(fd);
} else if (n 0) {close(fd);
} else {// 处理 buf
}
4、消息发送完毕
往写缓冲区写数据
int n write(fd, buf, dz);
if (n -1) {if (errno EINTR || errno EWOULDBLOCK) {return;}if (errno EPIPE) { // close(fd);}close(fd);
}
EINTR 表示系统调用被信号中断,在Linux系统中一些系统调用可以被信号中断而中断发生时系统调用通常会返回EINTR错误码。这是系统为了避免进程在等待系统调用时被无限暂停而中断休眠过程的一种防护机制。通常情况下EINTR错误不属于真正意义上的错误而是一种稍后可以重试的提示EWOULDBLOCK 表示写缓冲区已满EPIPE 错误表示在进行写入操作时写入的目标文件描述符或socket对应的管道被关闭或者在非阻塞模式下写入的目标已经没有足够的空间来接收数据