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

2025-03-21 10:11:50
推荐回答(2个)
回答1:

 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:释放文件锁

  设置读锁文件必须读式打设置写锁文件必须写式打设置读写锁文件必须读写式打

回答2:

可以啊。客户端和服务端是两个同的程序