![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
网络编程
无名_1989
1、每天坚持读书1小时;2、坚持提升专业,成为单位专业权威;3、战胜两个坏毛病——拖延与抱怨;4、先从形象上改变,提升你的自信;5、时常反省自己,但不诋毁自己;6、向优秀的人学习;7、坚持早睡早起;8、坚持体育锻炼;9、保持微笑;10、帮助他人
展开
-
gethostbyname获得相应域名的IP
#include #include #include #include #include #include int main(int argc, char **argv){ char *ptr, **pptr; struct hostent *hptr; char str[32]; ptr = argv[1]; if((hptr =原创 2017-05-26 11:27:11 · 347 阅读 · 0 评论 -
慢系统调用
对于那些可能永远阻塞的函数,我们可以称之为慢系统调用,多数网络支持的函数都属于这一类,如上列的这些函数,比如没有客户连接到服务器,那么服务器对与accept的返回没有保证。 应用在这的一个规则是,当一进程阻塞于一个慢系统调用,可能捕获到一个信号,等待信号处理程序返回时,系统调用可能返回一个-EINTR错误。有些内核可能重启系统调用。但是我们便于移植。当我们编写信号处转载 2017-12-27 18:22:39 · 443 阅读 · 0 评论 -
TCP服务器和客户端三部曲设置
1,客户端和服务器端都是用SO_REUSEADDR选项2,忽略SIGPIPE信号3,客户端设置TCP_NODELAY减少延迟原创 2017-12-27 17:31:24 · 424 阅读 · 0 评论 -
TCP close时,如果recvbuf中有数据,没有处理,不是正常FIN,而是RST,将丢失sendbuf里的数据
#include #include #include #include #include #include #include #include #include #include using namespace std;#define SERV_PORT 8888#define BUF_SIZE 100000int main(int argc, char *argv原创 2017-12-27 11:24:56 · 684 阅读 · 0 评论 -
为什么TIME_WAIT状态还需要等2MSL才能返回CLOSED状态
(1)可靠的实现TCP全双工链接的终止。这是因为虽然双方都同意关闭连接了,而且握手的4个报文也都协调和发送完毕,按理可以直接回到CLOSED状态(就好比从SYN_SEND状态到ESTABLISH状态那样);但是因为我们必须要假想网络是不可靠的,你无法保证你最后发送的ACK报文会一定被对方收到,因此对方处于LAST_ACK状态下的SOCKET可能会因为超时未收到ACK报文,而重发FIN报转载 2017-12-26 17:42:01 · 2847 阅读 · 0 评论 -
TCP/IP详解 以太网帧格式
如图所示,显示两种不同形式的封装格式。最常用的封装格式是RFC894定义的格式。两种帧格式均采用48bit的目的地址和源地址。原创 2017-12-17 22:11:37 · 967 阅读 · 0 评论 -
TCP的粘包问题
TCP(transport control protocol,传输控制协议)是面向连接的,面向流的,提供高可靠性服务。收发两端(客户端和服务器端)都要有一一成对的socket,因此,发送端为了将多个发往接收端的包,更有效的发到对方,使用了优化方法(Nagle算法),将多次间隔较小且数据量小的数据,合并成一个大的数据块,然后进行封包。这样,接收端,就难于分辨出来了,必须提供科学的拆包机制。即面向原创 2017-12-26 11:03:39 · 233 阅读 · 0 评论 -
TCP中的Nagle算法
一,Nagel算法 TCP/IP协议中,无论发送多少数据,总是要在数据前面加上协议头,同时,对方接受到数据,也需要发送ack表示确认。为了尽可能利用网络带宽,TCP总是希望尽可能发送足够大的数据。(在一个连接中会设置MSS参数,因此,TCP/IP希望每次都能够以MSS尺寸的数据发送数据)。Nagle算法就是为了尽可能发送大块数据,避免网络中充斥这许原创 2017-12-25 11:22:13 · 356 阅读 · 0 评论 -
TCP的MSS介绍
MSS是TCP选项中最经常出现,也是最早出现的选项。MSS选项占4byte。MSS是每一个TCP报文段中数据字段的最大长度,注意:只是数据部分的字段,不包括TCP的头部。TCP的三次握手中,每一方都会通告其期望收到的MSS(MSS只出现SYN数据包中)如果一方不接受另一方的MSS值则默认值为536byte。 MSS值太小或太大都是不适合。太小,例如M原创 2017-12-25 09:47:28 · 2404 阅读 · 0 评论 -
setsockopt设置SO_SNDBUF
case SO_SNDBUF: /* Don't error on this BSD doesn't and if you think about it this is right. Otherwise apps have to play原创 2017-06-02 14:05:34 · 4066 阅读 · 0 评论 -
SO_REUSEADDR解释
一般来说,一个端口释放后会等待两分钟之后才能再被使用,SO_REUSEADDR是让端口释放后立即就可以被再次使用。SO_REUSEADDR用于对TCP套接字处于TIME_WAIT状态下的socket,才可以重复绑定使用。server程序总是应该在调用bind()之前设置SO_REUSEADDR套接字选项。TCP,先调用close()的一方会进入TIME_WAIT状态SO_REUSE原创 2017-06-02 09:40:07 · 407 阅读 · 0 评论 -
accept函数笔记
#includeint accept(int sockfd, struct sockaddr *cliaddr, socklen_t * addrlen)accept函数有TCP服务调用,用于从已完成连接队列头返回下一个已完成连接。如果已完成连接队列为空,那么进程被投入睡眠(假定套接字为默认的阻塞方式)返回:若成功则为非负描述符,若出错则为-1在讨论accept函数时,我们称它的第一原创 2017-06-02 08:09:42 · 281 阅读 · 0 评论 -
EWOULDBLOCK和EAGAIN
#define EAGAIN 11 /* Try again */#define EINTR 4 /* Interrupted system call */#define EWOULDBLOCK EAGAIN /* Operation would block */EWOULDBLOCK用于非阻塞模式,不需要重新读或者写EINTR指被中断唤醒,需要重新读/写在Li转载 2017-06-02 07:49:50 · 5093 阅读 · 0 评论 -
进程间通信 管道pipe
#include #include#include #i原创 2017-05-31 17:01:29 · 215 阅读 · 0 评论 -
getaddrinfo函数解析
IPv4中使用gethostbyname()函数完成主机名到地址解析,这个函数仅仅支持IPv4,且不允许调用者指定所需地址类型的任何信息,返回的结构只包含了用于存储IPv4地址的空间。IPv6中引入了getaddrinfo()的新API,它是协议无关的,既可用于IPv4也可用于IPv6。getaddrinfo函数能够处理名字到地址以及服务到端口这两种转换,返回的是一个addrinfo的结构(列表)原创 2017-05-26 15:26:28 · 491 阅读 · 0 评论 -
epoll 水平触发和边缘触发的区别
EPOLLLT——水平触发 EPOLLET——边缘触发epoll有EPOLLLT和EPOLLET两种触发模式,LT是默认的模式,ET是“高速”模式。LT模式下,只要这个fd还有数据可读,每次 epoll_wait都会返回它的事件,提醒用户程序去操作,而在ET(边缘触发)模式中,它只会提示一次,直到下次再有数据流入之前都不会再提示了,无 论fd中是否还有数据可读。所以在ET模式下,read一个f...转载 2018-07-19 15:36:55 · 913 阅读 · 0 评论