套接字

TCP套接字函数

无人久伴 提交于 2020-02-26 10:59:34
1. socket函数 # include <sys/socket.h> int socket ( int family , int type , int protocol ) ; //若成功则返回非负描述符 //若出错返回-1 2.connect函数 # include <sys/socket.h> int connect ( int sockfd , const struct sockaddr * servaddr , socklen_t addrlen ) ; //若成功则返回0,出错返回-1 第二个参数是一个指向套接字地址结构的指针。 客户再调用函数connect前不必非得调用bind函数。 调用connect函数将激发TCP的三路握手,而且仅在 连接建立成功或出错时 才返回。 出错情况: (1)TCP客户端没有收到SYN分节的响应,返回ETIMEDOUT (2)若对SYN的响应为RST,表明服务器在指定端口没有进程在等待连接。 (3)SYN在中间某个路由器引发“目的地不可达”的ICMP错误。 若connect失败则该套接字不再可用,必须关闭。 3.bind函数 # include <sys/socket.h> int bind ( int sockfd , const struct sockaddr * myaddr , aocklen_t addrlen ) ; /

IO复用解述

寵の児 提交于 2020-02-25 19:54:30
I/O多路复用 select select 允许进程指示内核等待多个事件中的任何一个发生,并只在有一个或多个事件发生或指定时间后返回它。 select函数原型 #include <sys/select.h> #include <sys/time.h> int select(int maxfd,fd_set *rdset,fd_set *wrset,fd_set *exset,struct timeval *timeout); 返回值: 监听到有事件发生的文件描述符的个数,超时为0,错误为 -1. 1.当监视的相应的文件描述符集中满足条件时,比如说读文件描述符集中有数据到来时,内核(I/O)根据状态修改文件描述符集,并返回一个大于0的数。 2.当没有满足条件的文件描述符,且设置的timeval监控时间超时时,select函数会返回一个为0的值。 3.当select返回负值时,发生错误。 参数: maxfd: 是需要监视的最大的文件描述符值+1; rdset、wrset、exset: 是传入传出参数,fd_set类型,分别对应于需要检测的可读文件描述符的集合、可写文件描述符的集合、异常文件描述符的集合。若对其中任何参数条件不感兴趣,则可将其设为NULL。 timeout: 设置超时时间,指定select在返回前没有接收事件时应该等待的时间。 timeval 结构体 struct

I/O多路复用select/poll/epoll

Deadly 提交于 2020-02-25 19:52:32
前言 早期操作系统通常将进程中可创建的线程数限制在一个较低的阈值,大约几百个。因此, 操作系统会提供一些高效的方法来实现多路IO,例如Unix的select和poll。现代操作系统中,线程数已经得到了极大的提升,如NPTL线程软件包可支持数十万的线程。 I/O多路复用 select select 允许进程指示内核等待多个事件中的任何一个发生,并只在有一个或多个事件发生或指定时间后返回它。 select函数原型 #include <sys/select.h> #include <sys/time.h> int select(int maxfd,fd_set *rdset,fd_set *wrset,fd_set *exset,struct timeval *timeout); 返回值: 监听到有事件发生的文件描述符的个数,超时为0,错误为 -1. 1.当监视的相应的文件描述符集中满足条件时,比如说读文件描述符集中有数据到来时,内核(I/O)根据状态修改文件描述符集,并返回一个大于0的数。 2.当没有满足条件的文件描述符,且设置的timeval监控时间超时时,select函数会返回一个为0的值。 3.当select返回负值时,发生错误。 参数: maxfd: 是需要监视的最大的文件描述符值+1; rdset、wrset、exset: 是传入传出参数,fd_set类型

socket状态说明 LISTENING、ESTABLISHED、TIME_WAIT及CLOSE_WAIT

[亡魂溺海] 提交于 2020-02-25 08:13:23
TCP状态转移要点 TCP协议规定,对于已经建立的连接,网络双方要进行四次握手才能成功断开连接,如果缺少了其中某个步骤,将会使连接处于假死状态,连接本身占用的资源不会被释放。网络服务器程序要同时管理大量连接,所以很有必要保证无用连接完全断开,否则大量僵死的连接会浪费许多服务器资源。在众多TCP状态中,最值得注意的状态有两个:CLOSE_WAIT和TIME_WAIT。 1、LISTENING状态   FTP服务启动后首先处于侦听(LISTENING)状态。 2、ESTABLISHED状态   ESTABLISHED的意思是建立连接。表示两台机器正在通信。 3、CLOSE_WAIT 对方主动关闭连接或者网络异常导致连接中断,这时我方的状态会变成CLOSE_WAIT 此时我方要调用close()来使得连接正确关闭 4、TIME_WAIT 我方主动调用close()断开连接,收到对方确认后状态变为TIME_WAIT。TCP协议规定TIME_WAIT状态会一直持续2MSL(即两倍的分段最大生存期),以此来确保旧的连接状态不会对新连接产生影响。处于TIME_WAIT状态的连接占用的资源不会被内核释放,所以作为服务器,在可能的情况下,尽量不要主动断开连接,以减少TIME_WAIT状态造成的资源浪费。 目前有一种避免TIME_WAIT资源浪费的方法,就是关闭socket的LINGER选项

每个套接字地址error

怎甘沉沦 提交于 2020-02-24 06:31:51
套接字问题 1 netstat -aon|findstr 5037 2 根据pid,查询占用端口的应用,这里的pid为 8672,查询命令如图 3 杀死对应的PID,taskkill /pid 8672 /f 4 是不是杀不掉,哈哈哈哈 5 根据步骤2,在任务管理器里,直接结束进程,由于我已经结束掉了,所以图里没有; 当然你可能在任务管理器里,还是结束不掉对应进程 6 看看你的移动设备是不是还链接着电脑,把手机拔掉,如果对应进程没有自动消失, 那就尝试把进程杀掉,如果自动消失了,再重新连接上手机, 执行adb devices,希望你能成功,如果还不行,那我还真没辙了! 随便建了个群:219537016,有问题可以往里抛,估计也解决不了!qinjian! 来源: https://www.cnblogs.com/wujianqinjian/p/7742561.html

I/O多路复用模型之select(一)

淺唱寂寞╮ 提交于 2020-02-23 15:18:45
原理: select函数会等待,直到描述符句柄中有可用资源(可读、可写、异常)时返回,返回值是可用资源(可读/可写/异常等)描述符的个数(>0),0代表超时,-1代表错误。具体到内核大致是:当应用程序调用select() 函数, 内核就会相应调用 poll_wait(), 把当前进程添加到相应设备的等待队列上,然后将该应用程序进程设置为睡眠状态。直到该设备上的数据可以获取,然后调用wake_up()唤醒该应用程序进程。select每次轮训都会遍历所有描述符句柄。 函数接口: int select(int max_fd,fd_set * readfds,fd_set * writefds,fd_set * exceptfds,struct timeval * timeout); max_fd :fd+1 readfds :可读描述符句柄 writefds :可写描述符句柄 exceptfds:异常描述符句柄 timeout :超时时间 select函数的参数将告诉内核: (1)我们所关心的对应描述符句柄 (2)对于每个描述符我们所关心的条件,是否可读,是否可写或是否异常 (3)希望等待多长时间,struct timeval * timeout struct timeval{ long tv_sec; /*秒 */ long tv_usec; /*微秒 */ } timeout ==

iOS中的Socket

∥☆過路亽.° 提交于 2020-02-23 05:42:36
一、 网络各个协议:TCP/IP、UDP、SOCKET、HTTP、FTP等 网络七层由下往上分别为物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。其中物理层、数据链路层和网络层通常被称作媒体层,是网络工程师所研究的对象;传输层、会话层、表示层和应用层则被称作主机层,是用户所面向和关心的内容。 http协议 对应于应用层 tcp协议 对应于传输层 ip协议 对应于网络层 三者本质上没有可比性。 何况HTTP协议是基于TCP连接的。 TCP/IP是传输层协议,主要解决数据如何在网络中传输;而HTTP是应用层协议,主要解决如何包装数据。我们在传输数据时,可以只使用传输层(TCP/IP),但是那样的话,由于没有应用层,便无法识别数据内容,如果想要使传输的数据有意义,则必须使用应用层协议,应用层协议很多,有HTTP、FTP、TELNET等等,也可以自己定义应用层协议。WEB使用HTTP作传输层协议,以封装HTTP文本信息,然后使用TCP/IP做传输层协议将它发送到网络上。Socket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API),通过Socket,我们才能使用TCP/IP协议。 二、Http和Socket连接区别 2.1 TCP连接 要想明白Socket连接,先要明白TCP连接。手机能够使用联网功能是因为手机底层实现了TCP/IP协议

socket套接字编程(一)

拈花ヽ惹草 提交于 2020-02-23 01:40:43
目录 套接字介绍 TCP套接字编程 服务端流程 客户端流程 tcp套接字数据传输特点 网络收发缓冲区 tcp粘包 UDP套接字编程 服务端流程 客户端流程 总结(tcp套接字和udp套接字编程区别) 补充(socket模块方法和socket套接字属性) 套接字介绍 套接字:实现网络编程进行数据传输的一种技术手段 Python实现套接字编程:import socket 套接字分类: 流式套接字(SOCK_STREAM):以字节流方式传输数据(可以理解为像水流一样传输),实现tcp网络传输方案。(面向连接–tcp协议–可靠的–流式套接字) 数据报套接字(SOCK_DGRAM):以数据报形式传输数据(可以理解为像一瓶一瓶的水一样传输),实现udp网络传输方案。(无连接–udp协议–不可靠–数据报套接字) TCP套接字编程 服务端流程 Created with Raphaël 2.2.0 socket bind listen accept send/recv close socket表示创建一个套接字(买了一个电话) bind用于绑定主机ip地址等信息(好比办了一张电话卡) listen设置监听,可以被其他套接字或程序连接的功能(充话费) accept处于等待状态(让电话处于待机状态) send/recv发送/接收(用电话) close销毁套接字(把电话摔了) 创建套接字 sockfd

pythonnet-网络编程(1)

谁说我不能喝 提交于 2020-02-22 03:27:55
python的网络编程有不少难点,也容易忘记,最近我会陆续发出系统、完整pythonnet知识的博客,一边复习一边分享,感兴趣的可以关注我。 话不多说,开始吧。 网络编程 目的:数据的传输 ISO(国际标准化组织) OSI七层模型----->网络通信的标准化流程 应用层:提供用户服务,具体的内容由特定的程序规定 表示层:提供数据的加密和压缩优化 会话层:确定建立应用链接,选择传输服务 传输层:提供数据传输服务,进行流量控制 网络层:路由选择,网络互联 链路层:提供链路交换,具体消息的发送 物理层:物理硬件,接口,网卡的规定 可划分为四层模型 四层模型 应用层 传输层 网络层 物理链路层 划分为五层模型(TCP/IP模型) 应用层(应用层 表示层 会话层) 传输层 网络层 链路层 物理层 OSI模型的优点:将功能分开,降低网络传输中的耦合度,使开发流程更加清晰, 每部分各司其职。 高聚合:每个模块功能尽量单一,不会多个功能掺杂 低耦合:尽量降低每个模块之间的关联性 网络协议:在网络通信中协议各方必需遵守的规定。如建立什么连接,消息结构如何解析等。 应用层:TFTP HTTP DNS SMTP 传输层:TCP  UDP 网络层:IP 物理层:IEEE 网络相关概念 网络主机:在网络上确定一台主机 本地使用:“localhost”  127.0.0.1 网络地址:"0.0.0.0"   

TCP/IP、Http、Socket的区别

怎甘沉沦 提交于 2020-02-22 03:22:46
 网络由下往上分为   物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。   通过初步的了解,我知道IP协议对应于网络层,TCP协议对应于传输层,而HTTP协议对应于应用层,   三者从本质上来说没有可比性,   socket则是对TCP/IP协议的封装和应用(程序员层面上)。   也可以说,TPC/IP协议是传输层协议,主要解决数据如何在网络中传输,   而HTTP是应用层协议,主要解决如何包装数据。   关于TCP/IP和HTTP协议的关系,网络有一段比较容易理解的介绍:   “我们在传输数据时,可以只使用(传输层)TCP/IP协议,但是那样的话,如果没有应用层,便无法识别数据内容。   如果想要使传输的数据有意义,则必须使用到应用层协议。   应用层协议有很多,比如HTTP、FTP、TELNET等,也可以自己定义应用层协议。   WEB使用HTTP协议作应用层协议,以封装HTTP文本信息,然后使用TCP/IP做传输层协议将它发到网络上。”   而我们平时说的最多的socket是什么呢,实际上socket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API)。   通过Socket,我们才能使用TCP/IP协议。   实际上,Socket跟TCP/IP协议没有必然的联系。   Socket编程接口在设计的时候,就希望也能适应其他的网络协议