当前位置: 首页 > wzjs >正文

两学一做网站条幅做彩票网站要多少钱

两学一做网站条幅,做彩票网站要多少钱,服装设计有哪些网站,访问网站 过程《UNIX网络编程卷1:套接字联网API》第4章 基本TCP套接字编程 4.1 TCP套接字编程核心流程 TCP套接字编程遵循客户-服务器模型,其核心流程可分解为以下步骤(图4-1): 服务器端: socket():创建监…

《UNIX网络编程卷1:套接字联网API》第4章 基本TCP套接字编程


4.1 TCP套接字编程核心流程

TCP套接字编程遵循客户-服务器模型,其核心流程可分解为以下步骤(图4-1):

服务器端

  1. socket():创建监听套接字
  2. bind():绑定本地IP与端口
  3. listen():开启监听模式
  4. accept():接受客户端连接请求
  5. read()/write():与客户端通信
  6. close():关闭连接

客户端

  1. socket():创建通信套接字
  2. connect():发起连接请求
  3. read()/write():与服务器通信
  4. close():关闭连接
服务端流程:
开始↓
socket() 创建监听套接字↓
bind() 绑定本地IP与端口↓
listen() 开启监听模式↓
accept() 接受客户端连接请求↓
read()/write() 与客户端通信↓
close() 关闭连接
结束客户端流程:
开始↓
socket() 创建通信套接字↓
connect() 发起连接请求↓
read()/write() 与服务器通信↓
close() 关闭连接
结束

在这里插入图片描述


4.2 套接字创建与协议选择
4.2.1 socket()函数详解
#include <sys/socket.h>
int socket(int family, int type, int protocol);
  • 参数解析

    • family:协议族(如AF_INETAF_INET6AF_UNIX);
    • type:套接字类型(SOCK_STREAMSOCK_DGRAM);
    • protocol:通常为0(自动选择默认协议)。
  • 返回值

    • 成功:返回非负套接字描述符;
    • 失败:返回-1,设置errno(如EAFNOSUPPORT协议不支持)。

示例:创建IPv4 TCP套接字

int listenfd = socket(AF_INET, SOCK_STREAM, 0);
if (listenfd < 0)err_sys("socket error");
4.2.2 协议选择的工程实践
  • IPv4与IPv6兼容性设计:优先使用AF_UNSPEC配合getaddrinfo(详见第11章);
  • TCP与SCTP对比:TCP适合文件传输,SCTP适合多流场景(如5G信令)。

4.3 绑定地址与端口:bind()函数
4.3.1 bind()函数原型
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
  • 关键参数

    • addr:指向特定协议地址结构(如sockaddr_in);
    • addrlen:地址结构长度。
  • 常见错误

    • EADDRINUSE:端口被占用;
    • EACCES:绑定特权端口(<1024)权限不足。

示例:绑定IPv4地址到套接字

struct sockaddr_in servaddr;
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY); // 通配地址
servaddr.sin_port = htons(9999); // 端口号
if (bind(listenfd, (SA *)&servaddr, sizeof(servaddr)) < 0)err_sys("bind error");
4.3.2 通配地址与特定地址
  • INADDR_ANY:允许套接字监听所有本地接口;
  • 指定IP:仅监听特定接口(如inet_pton(AF_INET, "192.168.1.100", &servaddr.sin_addr))。

4.4 监听与连接队列:listen()函数
4.4.1 listen()函数原型
int listen(int sockfd, int backlog);
  • backlog参数
    定义内核维护的**未完成连接队列(SYN_RCVD状态)已完成连接队列(ESTABLISHED状态)**的总长度上限。
    • 传统BSD实现:backlog为两个队列总和;
    • Linux 4.3+:通过/proc/sys/net/core/somaxconn动态调整。

最佳实践

const int BACKLOG = 1024;
if (listen(listenfd, BACKLOG) < 0)err_sys("listen error");
4.4.2 连接队列溢出处理
  • 客户端收到ECONNREFUSED错误;
  • 服务器可通过netstat -s | grep overflow监控溢出次数。

4.5 接受连接:accept()函数
4.5.1 accept()函数原型
int accept(int sockfd, struct sockaddr *cliaddr, socklen_t *addrlen);
  • 参数特性
    • cliaddr:返回客户端地址信息;
    • addrlen:值-结果参数(需初始化为缓冲区大小)。

示例:获取客户端IP与端口

struct sockaddr_in cliaddr;
socklen_t clilen = sizeof(cliaddr);
int connfd = accept(listenfd, (SA *)&cliaddr, &clilen);
if (connfd < 0)err_sys("accept error");char client_ip[INET_ADDRSTRLEN];
printf("Client connected from %s:%d\n",inet_ntop(AF_INET, &cliaddr.sin_addr, client_ip, sizeof(client_ip)),ntohs(cliaddr.sin_port));
4.5.2 非阻塞accept与EAGAIN
  • 若监听套接字设为非阻塞且无连接到达,返回EAGAIN错误;
  • 需结合I/O复用(如selectepoll)处理。

4.6 发起连接:connect()函数
4.6.1 connect()函数原型
int connect(int sockfd, const struct sockaddr *servaddr, socklen_t addrlen);
  • 连接过程
    • 客户端发送SYN;
    • 等待服务器SYN+ACK;
    • 发送ACK完成三次握手(图4-2)。

示例:客户端连接服务器

struct sockaddr_in servaddr;
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(9999);
inet_pton(AF_INET, "192.168.1.100", &servaddr.sin_addr);
if (connect(sockfd, (SA *)&servaddr, sizeof(servaddr)) < 0)err_sys("connect error");
4.6.2 超时与错误处理
  • ETIMEDOUT:未收到SYN+ACK(可能服务器宕机);
  • ECONNREFUSED:目标端口无监听服务;
  • ENETUNREACH:路由不可达。

4.7 数据传输:read()与write()的局限性

TCP为字节流协议,需处理粘包部分读写问题:

  • 粘包:多次write可能被合并为一个TCP段;
  • 部分读写read可能返回小于请求长度的数据。

解决方案

  • 定义应用层协议(如固定长度头+变长体);
  • 使用readn/writen包裹函数(见第3章)。

4.8 连接终止:close()与shutdown()
4.8.1 close()函数
  • 减少套接字引用计数,计数为0时发送FIN;
  • 可能因SO_LINGER选项改变行为(详见第7章)。
4.8.2 shutdown()函数
int shutdown(int sockfd, int howto);
  • howto参数
    • SHUT_RD:关闭读端;
    • SHUT_WR:关闭写端(发送FIN);
    • SHUT_RDWR:全双工关闭。

优势:允许半关闭连接(如HTTP/1.1持久连接)。


4.9 并发服务器模型
4.9.1 多进程模型
pid_t pid;
int connfd;
for (;;) {connfd = accept(listenfd, NULL, NULL);if ((pid = fork()) == 0) {  // 子进程close(listenfd);       // 关闭监听套接字// 处理客户端请求exit(0);}close(connfd);             // 父进程关闭连接套接字
}
4.9.2 多线程模型
#include <pthread.h>
void *handle_client(void *arg) {int connfd = *((int *)arg);// 处理客户端请求close(connfd);return NULL;
}int main() {pthread_t tid;int connfd;for (;;) {connfd = accept(listenfd, NULL, NULL);pthread_create(&tid, NULL, handle_client, (void *)&connfd);}
}
4.9.3 I/O复用模型
// 使用select实现(详见第6章)
fd_set readset;
FD_ZERO(&readset);
FD_SET(listenfd, &readset);
select(listenfd + 1, &readset, NULL, NULL, NULL);
if (FD_ISSET(listenfd, &readset)) {connfd = accept(listenfd, NULL, NULL);// 处理连接
}

4.10 实战:完整Echo服务器与客户端
4.10.1 Echo服务器代码
#include "unp.h"void str_echo(int sockfd) {ssize_t n;char buf[MAXLINE];
again:while ((n = read(sockfd, buf, MAXLINE)) > 0)writen(sockfd, buf, n);if (n < 0 && errno == EINTR)goto again;else if (n < 0)err_sys("str_echo: read error");
}int main() {int listenfd = Socket(AF_INET, SOCK_STREAM, 0);// 绑定与监听(代码同前)for (;;) {int connfd = accept(listenfd, NULL, NULL);if (fork() == 0) {close(listenfd);str_echo(connfd);exit(0);}close(connfd);}
}
4.10.2 Echo客户端代码
#include "unp.h"void str_cli(FILE *fp, int sockfd) {char sendline[MAXLINE], recvline[MAXLINE];while (fgets(sendline, MAXLINE, fp) != NULL) {writen(sockfd, sendline, strlen(sendline));if (readline(sockfd, recvline, MAXLINE) == 0)err_quit("str_cli: server terminated prematurely");fputs(recvline, stdout);}
}int main() {int sockfd = Socket(AF_INET, SOCK_STREAM, 0);// 连接服务器(代码同前)str_cli(stdin, sockfd);exit(0);
}

4.11 本章小结与习题

小结:本章系统讲解了TCP套接字编程的核心API与并发模型,通过Echo案例展示了完整开发流程。

习题

  1. 实现支持多客户端的UDP Echo服务器,对比TCP/UDP编程差异;
  2. 修改Echo服务器为线程池模型,测试并发性能;
  3. 使用tcpdump抓取三次握手与四次挥手数据包,分析字段含义。

付费用户专属资源

  • 完整Echo工程(含Makefile与压力测试脚本);
  • TCP状态转换图(矢量图);
  • 扩展阅读:《TCP协议栈内核实现剖析》。

4.11 本章小结与习题

小结:本章系统讲解了TCP套接字编程的核心API与并发模型,通过Echo案例展示了完整开发流程。

习题

  1. 实现支持多客户端的UDP Echo服务器,对比TCP/UDP编程差异;
  2. 修改Echo服务器为线程池模型,测试并发性能;
  3. 使用tcpdump抓取三次握手与四次挥手数据包,分析字段含义。

付费用户专属资源

  • 完整Echo工程(含Makefile与压力测试脚本);
  • TCP状态转换图(矢量图);
  • 扩展阅读:《TCP协议栈内核实现剖析》。

通过本章学习,读者将掌握TCP套接字编程的核心技术,并具备开发高并发网络服务的能力。


文章转载自:

http://m4PnQ0El.cbqqz.cn
http://ur2xLnuj.cbqqz.cn
http://kmq7U7Bn.cbqqz.cn
http://1pErK7m8.cbqqz.cn
http://g5JiN3Kw.cbqqz.cn
http://JpbrhJFm.cbqqz.cn
http://PnIrKP87.cbqqz.cn
http://tmITUgNW.cbqqz.cn
http://kMbl5Oq3.cbqqz.cn
http://7s42jVkt.cbqqz.cn
http://ADUneIJf.cbqqz.cn
http://udiXlZXO.cbqqz.cn
http://lOPEyIjz.cbqqz.cn
http://hL2N2eXk.cbqqz.cn
http://CVPEtK1m.cbqqz.cn
http://SulLK8WG.cbqqz.cn
http://QDSYeUrX.cbqqz.cn
http://lJeMY6rD.cbqqz.cn
http://0Q5ZuFY7.cbqqz.cn
http://huG7TqJT.cbqqz.cn
http://tNTZPr3g.cbqqz.cn
http://sghBBjwJ.cbqqz.cn
http://orLb3Aaz.cbqqz.cn
http://1omkFiJK.cbqqz.cn
http://qufXk61r.cbqqz.cn
http://WdnBbOTF.cbqqz.cn
http://udGwd184.cbqqz.cn
http://gKQKuyQb.cbqqz.cn
http://gqp33znf.cbqqz.cn
http://OkNhgBs6.cbqqz.cn
http://www.dtcms.com/wzjs/632787.html

相关文章:

  • 中国品牌建设促进会网站一般网站设计多大宽度
  • 莱芜网站discuz论坛 整合到网站
  • 知乎网站建设wordpress幻灯片的调用
  • 关于电子商务网站建设的参考文献中国建设银行官网站安装k宝
  • 什么网站可以接图做图外国人做的关于中国的视频网站
  • 网站怎么做电脑系统网站建设 网站内容 采集
  • 用虚拟机做服务器搭建网站濮阳市城乡一体化示范区西湖医院
  • 做网站编辑好还是期刊编辑好wordpress爆破思路
  • 重庆免费网站建站模板免费网站建设朋友交流
  • 网站开发工程师累不累做网站的流程分析-图灵吧
  • 网站开发需要团队吗移动查询代码大全
  • 可以通过哪些网站注册域名58做网站吗
  • php做的网站打包成exe广告公司名字怎么取好
  • 徐州新沂网站建设域名及密码登录域名管理网站
  • 建设一个小说网站的步骤小米商城wordpress
  • 网站空间可以转移吗wordpress 免费中文模板
  • 网站热销榜怎么做网站建设与推广销售户话术
  • 温州做网站优化知名网站域名被抢注
  • 能源产品网站建设多少钱平面设计电影
  • 网站推广的具体方法如何在手机修改wordpress
  • 网站建设行业2017企业网站管理是什么
  • 网站做跳转链接北京网站建设网站改版的费用
  • 微信公众平台一定要找网站做吗wordpress js版本
  • seo综合查询站长工具建设交通人才网站
  • 选做旅游网站的课题分析免费解析网站制作
  • 网易那个网站可以做字幕深圳乐安居网站谁做的
  • 长春住房和城乡建设部官方网站长葛哪里有做网站的
  • 网络营销建设网站实训网站开发前台代码和后台代码
  • 优质的设计网站有哪些济南高风险区最新通告
  • 给公司做网站怎么弄外贸网站建设注意什么