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

许昌市住房和城乡建设部网站重庆专业建网站

许昌市住房和城乡建设部网站,重庆专业建网站,企业网站管理系统哪个好,温州建设网站制作1.TCP通信程序的编写 面向连接、可靠传输、提供字节流传输服务 客户端向服务器发送一个连接建立的请求流程,上图中服务端第三步详细流程 2.TCP接口 socket--创建套接字 int socket(int domain, int type, int protocol); bind---绑定 intbind(int sockfd, struct s…

1.TCP通信程序的编写

面向连接、可靠传输、提供字节流传输服务

客户端向服务器发送一个连接建立的请求流程,上图中服务端第三步详细流程

2.TCP接口

socket--创建套接字

int socket(int domain, int type, int protocol);

bind---绑定

intbind(int sockfd,  struct sockaddr*addr, socklen_len);

sockfd : socket返回的套接字描述符

addr: 要绑定的地址信息(不同地址域类型,有不同的地址结构)

listen--监听

int listen(int sockfd, int backlog);

注意:listen第二个参数限制的是,同一时刻最大并发连接数,而不是总体能建立的连接数量,因为随着accept取出一个已完成连接,就又可以建立一个新的连接放在队列中。

connect--向服务端发送连接请求,这个接口只有客户端用到

int connect(int sockfd, struct sockaddr *adddr, socklen_t len);

sockfd:套接字描述符

addr: 服务端的地址信息

addrlen:地址长度

accept--获取新建连接

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

从内核sockfd指定的监听套接字对应的已完成连接队列中,取出一个socket,并返回这个socket的描述符

通过addr参数返回具体连接请求来源于哪个客户端

addr: accept内部进行填充客户端地址,是一个输出参数

addrlen: 地址信息长度,输入输出参数,用于指定想要获取的地址长度,以及返回实际的地址长度

返回值: 成功则返回新建连接的套接字描述符; 出错返回-1

send/recv--收发数据

ssize_t send(int sockfd, void *data, size_t len, int flag);

相较于sendto不用在指定对端地址了返回值: 成功则返回实际发送的数据长度; 出错则返回-1

ssize_t recv(int sockfd, void *buf, size_t len, int flag);

相较于recvfrom,不用获取对端地址了返回值: 成功则返回实际发送的字节长度; 出错则返回-1; 连接断开则返回0

tcp是面向连接的,一旦连接断开 (对方可能关闭了连接,或者网络出问题了......)将无法继续通信

recv函数返回0,没有读到数据是一回事,最主要的是要告诉使用者连接断开了

close--关闭套接字

int close(int fd);

3.封装一个TCPSocket类

主要是对socket操作进行封装,简化使用难度,下面为主要过程,具体代码见xshell

问题的探讨:

tcp服务器,涉及到对多个socket进行操作 (有多少客户端连接上来,就有多少socket)每一个socket都需要 accept, recv, send,但是这三个操作都是阻塞操作,

accept,如果没有新连接到来就会阻塞

recv,如果客户端没有发送数据就会阻塞

因此一旦获取了一个新连接,但是这个新连接,一直不发送数据,就会卡在recv处,没办法去调用accept获取下一个连接了而一旦一个连接通信完毕,程序流程运行到accept,但是这时没有新连接,就会卡在这里,就算上一个连接发送数据,也无法处理

tcp服务器觉得别扭的本质原因: 在一个执行流中进行的操作太多,并且这些操作都是阻塞操作。

解决方案:既然一个执行流中不能进行多个阻塞操作,干脆就创建多个执行流(多执行流任务处理)

主执行流只干一件事: 针对监听套接字获取新建连接,获取了一个新连接,就为这个新连接的操作创建一个执行流

其他执行流干的事情: 每个执行流都只负责与一个客户端通信

这样做有个好处,任意一个线程阻塞,都不会影响其他线程,也就是不会影响与其他客户端的通信

具体的实现过程分为两种: 多进程,多线程

多进程: 稳定,健壮

多线程:灵活,消耗小。

多进程方案实现

多进程方案实现: accept之后,创建子进程;但是需要注意僵尸进程的处理

相较于多进程版本,流程上没有大的差别,也是获取一个新建连接之后,创建一个线程出来

注意事项:

线程间是共用同一个文件描述符表,因此对这个通信套接字描述符的操作,只能由负责这个描述符操作的线程进行关闭,其他的线程不能关闭。

局部变量的使用,线程创建的时候,千万要注意传参,不能因为传递局部变量地址,而导致线程内访问的时候出现内存访问错误

4.tcp通信程序编写与运行中遇到的一些特殊情况

连接断开: tcp是面向连接的通信,一旦连接断开就无法通信

问题:如何在代码中知道连接断开了? 连接断开后,在代码中的体现是什么?

当recv函数接收数据的时候,返回0,代表的不仅仅是没有接收到数据,更多是为了表示连接断开了!!!

当send函数发送数据的时候,程序直接异常 (SIGPIPE) 退出,

因此如果网络通信中,不想让程序因为连接断开而导致发送数据的时候程序异常退出,就对SIGPIPE信号进行处理

问题: 有时候网络程序关闭后,无法立即启动,会bind绑定地址报错,绑定失败,地址已经被使用

网络通信程序,如果程序是主动关闭的一方,程序会无法立即启动

因为一个程序主动关闭了连接,这个连接并不会立即被释放(对应的地址和端口依然被占用),而是要等待一段时间。

netstat-anptu命令

这是查看主机上所有网络连接状态的命令

http://www.yayakq.cn/news/479502/

相关文章:

  • 百度做公司网站需要多少钱建设一个中英文双版的网站
  • 开发网站的经济可行性如何做优秀的游戏视频网站
  • 公司网站建设的费用兰州网站开发公司
  • 无锡建设企业网站通州微网站优化
  • 做面点的网站网络监控系统
  • 网站建设实例教程 pdf外国网站怎么进入
  • 域名注册后怎么建网站如何做网站的薪酬调查
  • 免费搭建网站wordpress制作主题
  • 用自己的电脑做视频网站吗广告设计软件ai
  • 医疗在线网站建设网站栏目名
  • 深圳做网站seo如何 做网站
  • 公司网站建设调研问卷如何评价企业网站推广效果?
  • 金融网站模板源代码怎么制作公众号文章
  • jsp获取网站域名专门做图的网站
  • 网页设计与网站建设的目的易语言做网站源码
  • 自己做本市网站常用的网页开发工具有哪些
  • 网站建设安全协议无锡微信网站开发
  • 各地网站备案开公司要做哪些准备
  • 网站备案 加急广州sem代运营推广公司
  • 网站建设推广价格做兼职一般去哪个网站好
  • 平顶山做网站wordpress主题插件免费
  • 被墙的网站有哪些怎么制作图片和视频一起的小视频
  • 网站的流量检测怎么做wordpress制作模板
  • 百度云加速 网站关键词wordpress4.7源码下载
  • 互联网网站建设一条龙服务开什么店投资小利润高
  • 上海市建设工程安全质量监督总站网站广元网站建设广元
  • 杭州装饰网站建设方案中国最新军事新闻最新消息2023
  • 广州行业门户网站建设知名网站建设代理
  • python一句做网站wordpress 使用ip访问不了
  • 网站导航自适应wordpress 仿站 菜单