长风破浪会有时,直挂云帆济沧海

Dream Word

博客园 首页 新随笔 联系 订阅 管理
  • Select -- synchronius I/O multiplexing
    • select, FS_SET,FD_CLR,FD_ISSET,FD_ZERO
 1 #include <sys/time.h>
 2 #include <sys/types.h>``
 3 #include <unistd.h>
 4 
 5 int select(int nfds,fd_set *readfds, fd_set *writefds,fd_set exceptfds,struct timeval* timeout);
 6 
 7 void FD_CLR(int fd, fd_set *set);
 8 void FD_ISSET(int fd,fd_set *set);
 9 void FD_SET(int fd, fd_set *set);
10 void FD_ZERO(fd_set *set);
  •  poll:
    • #include<poll.h>
    • int poll(struct pollfd *fds, nfds_t nfds,int timeout);

struct pollfd{

  int fd;

  short events;

  short revents;

};

 

(一)如果客户端关闭套接字close

而服务器调用一次write服务器就会收到一个RST segment(TCP传输层)

如果服务器端再次调用了write,这个时候就会产生SIGPIPE信号,如果不忽略该信号则会导致整个进程退出。

解决办法:signal(SIGPIPE, SIG_IGN);

 

(二):TIME_WAIT状态对大并发服务器的影响:

应该尽可能在服务器端避免出现TIME_WAIT状态

如果服务器端主动断开连接(先于客户端调动close),那服务器端就会进入TIME_WAIT状态,这样在一定时间内内核会保持一些资源,使得服务器的并发性降低。

解决办法:让客户端主动断开连接,这样就把TIME_WAIT状态分散到大量的客户端,如果客户端不活跃了,一些客户端不断开连接,这样就会占用服务器的连接资源。所以服务器需要有机制来剔除不活跃的连接close

 

posted on 2018-04-09 20:58  长风II  阅读(124)  评论(0编辑  收藏  举报