
网络编程
昨夜的秋天
这个作者很懒,什么都没留下…
展开
-
SIGPIPE信号产生的原因
在TCP连接半关闭状态下,其退化成了单工通信,即一方只能发,一方只能收。此时,如果让只能收的一方去调用write函数发数据,会导致TCP给其回复一个RST段,之后如果再调用write就会产生SIGPIPE信号,对于这个信号的处理我们通常忽略即可。signal(SIGPIPE,SIG_IGN)默认的SIGPIPE信号的处理方式为exit当前进程。...原创 2018-08-09 11:07:45 · 1035 阅读 · 1 评论 -
TCP/IP如何保证有效?
1.TCP/IP使用超时重传机制,保证当丢包时能重传该数据包。那如何保证数据包一定到呢,这就引入了确认机制,通过确认保证接收方已经接收到该数据包,并且告诉发送方我想接收的下一个数据包的序号。即为超时重传+确认。2.应用数据被分为TCP认为合适大小的数据块(MSS段),进行段传输。即为合理分段传输。3.由于IP是不可靠传递,所以可能数据段失序,此时通过头部的序号进行重排。即为重新排序。4...原创 2018-08-07 00:03:10 · 564 阅读 · 0 评论 -
对于listen函数第二个参数的理解
之前一直没有彻底搞清楚listen这个第二个参数指定之后到底有什么作用,今天看UNIX网络编程总算是搞明白了。我们从头开始说:监听端口后,被动套接字会等待连接,此时系统维护着两个队列,第一个队列存放的是已建立连接的套接字(即完成三次握手后的),第二个队列存放的是未建立连接的套接字(处在三次握手中的)。每次accept函数会将第一个队列中的套接字返回,进行通信,以完成网络传输。所以liste...原创 2018-08-08 19:34:17 · 4738 阅读 · 9 评论 -
关于服务器进入TIME_WAIT状态,导致无法重启绑定端口的解决方案
我们在bind之前 开启地址重复利用即可解决绑定失败的问题。....setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on)); //直接调用即可bind(....)....原创 2018-08-08 19:49:44 · 2207 阅读 · 0 评论 -
流协议,粘包,产生原因,解决方案
TCP是字节流,无边界的协议。UDP是传的报文,是有边界的。所以TCP会产生粘包问题 具体原因:1.由于程序write进套接字缓冲区时将一段完整的消息分开了,此时会造成粘包。2.由于TCP协议有MSS的限制,可能会产生分段,所以会产生粘包。3.由于IP协议有MTU的限制,可能会进行分片,所以会产生粘包。解决方案:应用层自己维护消息与消息的边界。1.定长包2.包尾加\...原创 2018-08-08 21:31:46 · 210 阅读 · 0 评论