Liunx 套接字编程(2)TCP接口通信程序

这篇具有很好参考价值的文章主要介绍了Liunx 套接字编程(2)TCP接口通信程序。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.TCP通信程序的编写

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

Liunx 套接字编程(2)TCP接口通信程序

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

Liunx 套接字编程(2)TCP接口通信程序

2.TCP接口

socket--创建套接字

int socket(int domain, int type, int protocol);
Liunx 套接字编程(2)TCP接口通信程序

bind---绑定

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

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

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

listen--监听

int listen(int sockfd, int backlog);
Liunx 套接字编程(2)TCP接口通信程序

注意: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

Liunx 套接字编程(2)TCP接口通信程序

问题的探讨:

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

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

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

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

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

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

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

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

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

Liunx 套接字编程(2)TCP接口通信程序

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

多进程: 稳定,健壮

多线程:灵活,消耗小。

多进程方案实现

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

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

注意事项:

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

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

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

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

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

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

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

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

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

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

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

netstat-anptu命令

这是查看主机上所有网络连接状态的命令文章来源地址https://www.toymoban.com/news/detail-474376.html

Liunx 套接字编程(2)TCP接口通信程序

到了这里,关于Liunx 套接字编程(2)TCP接口通信程序的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Socket套接字编程(实现TCP和UDP的通信)

      🎉🎉🎉点进来你就是我的人了 博主主页:🙈🙈🙈戳一戳,欢迎大佬指点! 人生格言: 当你的才华撑不起你的野心的时候,你就应该静下心来学习! 欢迎志同道合的朋友一起加油喔 🦾🦾🦾 目标梦想:进大厂,立志成为一个牛掰的Java程序猿,虽然现在还是一个🐒嘿嘿 谢谢

    2024年02月03日
    浏览(88)
  • 【C/C++套接字编程】TCP协议通信的简单实现

    目录 前言 一、TCP_Server.cpp 二、TCP_Client.cpp 三、TCP Server.cpp (多线程) 总结 系列博客 【C/C++套接字编程】套接字的基本概念与基础语法_Mr_Fmnwon的博客-CSDN博客 【C/C++套接字编程】TCP通信实验_Mr_Fmnwon的博客-CSDN博客 【C/C++套接字编程】UDP协议通信的简单实现_Mr_Fmnwon的博客-CSDN博

    2024年02月09日
    浏览(40)
  • 【Linux】socket 编程(socket套接字介绍、字节序、socket地址、IP地址转换函数、套接字函数、TCP通信实现)

    橙色 所谓套接字,就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。 一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。从所处的地位来讲,套接字上联应用进程,下联网络协议栈,是应用程序通过网络协议进程通

    2024年02月09日
    浏览(53)
  • python3套接字编程之socket和socketserver(TCP和UDP通信)

    socket和socketserver是python3中socket通信模块,关于其使用做如下总结。 目录 1.socket 1.1模块引入 1.2套接字获取 1.3套接字接口 1.3.1 服务端 1.3.2 客户端套接字函数 1.3.3 公共套接字函数 1.3.4 面向锁的套接字方法 1.3.5 面向文件的套接字的函数 2.socketserver 3.TCP 3.1 socket类型TCP 3.2 sockets

    2024年02月15日
    浏览(74)
  • 【网络编程】网络编程套接字(三)TCP网络程序

    与前边的UDP网络程序相同,创建套接字的接口都是socket,下边对socket接口进行介绍: 协议家族选择AF_INET,因为我们要进行网络通信。 而第二个参数,为服务类型,传入SOCK_STREAM,我们编写TCP程序,所以要选择流式的服务。 第三个参数默认传入0,由前两个参数就可以推出这是

    2024年02月16日
    浏览(57)
  • 【Java】网络编程与Socket套接字、UDP编程和TCP编程实现客户端和服务端通信

    为什么需要网络编程? 现在网络普及程序越来越高,网络上保存着我们日常生活中需要的各种资源,使用程序通过网络来获取这些资源的过程就需要网络编程来实现。 什么是网络编程? 网络编程,指网络上的主机,通过不同的进程以程序的方式实现网络通信(网络数据传输)

    2024年02月17日
    浏览(73)
  • 网络编程套接字(2)——简单的TCP网络程序

    我们将TCP服务器封装成一个类,当我们定义出一个服务器对象后需要马上对服务器进行初始化,而初始化TCP服务器要做的第一件事就是创建套接字。 TCP服务器在调用socket函数创建套接字时,参数设置如下: 协议家族选择 AF_INET ,因为我们要进行的是网络通信。 创建套接字时

    2024年02月06日
    浏览(54)
  • 套接字通信(附带单线程TCP套接字通信代码)

    1. 概念 1.1 局域网和广域网 局域网(LAN)和广域网(WAN)是两种不同范围的计算机网络,它们用于连接多台计算机以实现数据共享和通信。 局域网(LAN): 定义: 局域网是一个较小范围内的网络,通常限定在某个地理区域,比如一个办公室、学校或者家庭。 范围: LAN 的范

    2024年01月21日
    浏览(44)
  • Python入门【TCP建立连接的三次握手、 TCP断开连接的四次挥手、套接字编程实战、 TCP编程的实现、TCP双向持续通信】(二十七)

    👏作者简介:大家好,我是爱敲代码的小王,CSDN博客博主,Python小白 📕系列专栏:python入门到实战、Python爬虫开发、Python办公自动化、Python数据分析、Python前后端开发 📧如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步👀 🔥如果感觉博主的文章还不错的

    2024年02月12日
    浏览(40)
  • 【探索Linux】P.29(网络编程套接字 —— 简单的TCP网络程序模拟实现)

    在前一篇文章中,我们详细介绍了UDP协议和TCP协议的特点以及它们之间的异同点。 本文将延续上文内容,重点讨论简单的TCP网络程序模拟实现 。通过本文的学习,读者将能够深入了解TCP协议的实际应用,并掌握如何编写简单的TCP网络程序。让我们一起深入探讨TCP网络程序的

    2024年04月14日
    浏览(79)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包