共 135 篇文章 |
|
关于网络编程中MTU、TCP、UDP优化配置的一些总结。其中以太网(Ethernet)的数据帧在链路层 IP包在网络层 TCP或UDP包在传输层 TCP或UDP中的数据(Data)在应用层 它们的关系是 数据帧{IP包{TCP或UDP包{Data}}} ---------------------------------------------------------------------------------在应用程序中我们用... 阅176 转0 评0 公众公开 17-01-17 10:41 |
在多进程并发服务器中,父子进程共享着套接字,套接字描述符引用计数记录着共享着的进程个数,当父进程或某一子进程close掉套接字时,描述符引用计数会相应的减一,当引用计数仍大于零时,这个close调用就不会引发TCP的四路握手断连过程。客户端有两个进程,父进程和子进程,子进程是在父进程和服务器建连之后fork出来的,子进程发送标准输入终... 阅21 转0 评0 公众公开 17-01-13 14:08 |
Selector selector = Selector.open();int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event)epoll_ctl可以操作epoll_create创建的epoll,如将socket句柄加入到epoll中让其监控,或把epoll正在监控的某个socket句柄移出epoll。int epoll_wait(int epfd, struct epoll_event *events,int maxevents, int timeout)epoll_wait在调... 阅110 转0 评0 公众公开 16-09-09 12:57 |
Reactor单线程模型。2、多线程模型:为了解决单线程模型存在的一些问题,演化而来的Reactor线程模型。Reactor多线程模型。网络IO的读写操作由一个NIO线程池负责,线程池可以采用标准的JDK线程池实现,包含一个任务队列和N个可用的线程,由这些NIO线程负责消息的读取、解码、编码和发送;在这类场景下,单独一个Acceptor线程可能会存在性能不足... 阅90 转0 评0 公众公开 16-09-09 12:34 |
浅谈 TCP/IP 网络编程中 socket 的行为。Socket I/O系统调用(重点如read/write),这是TCP/IP协议在应用层表现出来的行为。关于TCP/IP协议,建议参考Richard Stevens的《TCP/IP Illustrated,vol1》(TCP/IP详解卷1)。如果a进程先write然后阻塞在read,由于收不到B机器TCP/IP栈的ack,TCP会持续重传12次(时间跨度大约为9分钟),然后在阻塞... 阅44 转0 评0 公众公开 16-08-23 12:52 |
1.4,客户端调用close()+SO_LINGER选项。1.1与1.2等价,就算客户端进程关闭,系统内核也会自动close(socket),且注意,当socket引用为0时才会真正调用close(),close()总是立即返回的,然后由系统尝试发送完内核缓冲区内的所有数据,接着才发送FIN。主动关闭的一方先发送FIN,收到ACK后,进入FIN_WAIT2状态,此时也叫做“半关闭”状态,特别须... 阅155 转1 评0 公众公开 16-06-30 22:59 |
子进程的关闭处理应该是这样的:shutdown(sockfd, SHUT_RDWR);close(sockfd);这样处理,服务器的FIN会被发出,socket进入LAST_ACK状态,等待最后的ACK到来,就能进入初始状态CLOSED。SHUT_RDWR:相当于调用shutdown两次:首先是以SHUT_RD,然后以SHUT_WR注意:在多进程中如果一个进程中shutdown(sfd, SHUT_RDWR)后其它的进程将无法进行通信. 如果... 阅78 转0 评0 公众公开 16-06-30 22:27 |
后台进程中printf导致的errno=5的错误(摘)原来的代码是这样的(send调用的情况类似):s32 len = recv( m_socket, data, len, 0 );// printf("recv = %d\n", len);if( len==-1 && (errno==EAGAIN || errno==EWOULDBLOCK) ){而socket在调用recv返回EAGAIN错误后,因为又调用了printf导致errno被修改了,导致后面的判断条件... 阅491 转0 评0 公众公开 16-06-29 12:23 |
linux下使用write\send发送数据报 EAGAIN : Resource temporarily unavailable 错。close(tcp_client_sock);setsockopt(tcp_client_sock,SOL_SOCKET,SO_SNDBUF,&opt,sizeof(int));假如发送端流量大于接收端的流量(意思是epoll所在的程序读比转发的socket要快),由于是非阻塞的socket,那么send()函数虽然返回,但实际缓冲区的数据并未真正发给... 阅2159 转2 评0 公众公开 16-06-14 18:06 |
fd_set集合可以通过一些宏由人为来操作,比如清空集合FD_ZERO(fd_set *),将一个给定的文件描述符加入集合之中FD_SET(int ,fd_set *),将一个给定的文件描述符从集合中删除FD_CLR(int ,fd_set*),检查集合中指定的文件描述符是否可以读写FD_ISSET(int ,fd_set* )。struct fd_set fds;FD_SET(fp,&fds);FD_SET(int fd, fd_set *fdset):建立... 阅10 转0 评0 公众公开 16-06-10 11:04 |