socket通信可不可以Server端设成非阻塞方式,Client端设成阻塞模式?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了socket通信可不可以Server端设成非阻塞方式,Client端设成阻塞模式?相关的知识,希望对你有一定的参考价值。

 Windows用socket设置非阻塞式 :

  unsigned long ul=1;

  SOCKET s=socket(AF_INET,SOCK_STREAM,0);

  int ret=ioctlsocket(s, FIONBIO, (unsigned long *)&ul);//设置非阻塞模式

  if(ret==SOCKET_ERROR)//设置失败

  

  

  Linux用socket设置非阻塞式

  int flags = fcntl(socket, F_GETFL, 0);

  fcntl(socket, F_SETFL, flags | O_NONBLOCK);

  用socket设置非阻塞式

  int flags = fcntl(socket, F_GETFL, 0);

  fcntl(socket, F_SETFL, flags | O_NONBLOCK);

  非阻塞设置阻塞用

  int flags = fcntl(socket, F_GETFL, 0);

  fcntl(socket, F_SETFL, flags & ~O_NONBLOCK);

  功能描述:根据文件描述词操作文件特性

  用:

  int fcntl(int fd, int cmd);

  int fcntl(int fd, int cmd, long arg);

  int fcntl(int fd, int cmd, struct flock *lock);

  参数:

  fd:文件描述词

  cmd:操作命令

  arg:供命令使用参数

  lock:同

  操作命令供使用

  . F_DUPFD :复制文件描述词

  二. FD_CLOEXEC :设置close-on-exec标志FD_CLOEXEC位0执行execve程文件保持打反则关闭

  三. F_GETFD :读取文件描述词标志

  四. F_SETFD :设置文件描述词标志

  五. F_GETFL :读取文件状态标志

  六. F_SETFL :设置文件状态标志

  其O_RDONLY O_WRONLY O_RDWR O_CREAT O_EXCL O_NOCTTY O_TRUNC受影响

  更改标志 O_APPENDO_ASYNC O_DIRECT O_NOATIME O_NONBLOCK

  七. F_GETLK, F_SETLK F_SETLKW :获取释放或测试记录锁使用参数结构体指针:

  F_SETLK:指定字节范围获取锁(F_RDLCK, F_WRLCK)或者释放锁(F_UNLCK)与另进程锁操作发冲突返 -1并errno设置EACCES或EAGAIN

  F_SETLKW:行同F_SETLK除能获取锁睡眠等待外等待程接收信号立即返并errno置EINTR

  F_GETLK:获取文件锁信息

  F_UNLCK:释放文件锁

  设置读锁文件必须读式打设置写锁文件必须写式打设置读写锁文件必须读写式打
参考技术A 可以啊。客户端和服务端是两个同的程序追问

像这种Client端不定时向Server端发送数据的工作情况,server端是不是必须是用非阻塞模式啊?

追答

不一定,理论上都是可以的。服务端一般是多线程的。每一个客户端发起一个socket通信,服务端都要产生一个与之对应的线程来处理客户端的socket通信,这样才合理。客户端的socket通信与服务端的socket通信一一对应的,所以阻塞与否没有什么关系。程序都运行的很好。

tcp socket通信 Round 2

  • server端未创建socket;server端创建socket;server创建socket并bind:此时client端尝试connect不会阻塞(未作设置),但errno为111,即

#define ECONNREFUSED 111 /* Connection refused */

  • server端创建socket,调用bind,listen,未调用accept,此时client尝试connect不会阻塞,errno为0即正常
  • 使用epoll时,如果先调用close,再对fd做操作,如DEL,epoll_ctl报错
    • 调用close之后,无需再在epoll里对fd作操作(存疑)
    • 先epoll_ctl删除fd,再调用close
  • setsocketopt函数使用SO_REUSEADDR仍报错地址已在使用(centos),改为使用SO_REUSEPORT工作正常
  • centos上绑定地址后,要开端口,命令如下
iptables -I INPUT -p tcp --dport 1234 -j ACCEPT
  • client端调用close后,不能再对fd调用connect。需再次调用socket,对此时的fd调用connect。   

以上是关于socket通信可不可以Server端设成非阻塞方式,Client端设成阻塞模式?的主要内容,如果未能解决你的问题,请参考以下文章

Linux Socket

socket基本概念

tcp socket通信 Round 2

MFC socket编程

同步异步阻塞非阻塞的概念理解

tcp外网通信