为什么会阻塞在select上?select函数本身是阻塞的吗?

magicing magicing 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
程序大致如下,省略了socket的建立过程,也调用了ioctlsocket函数把s转成非阻塞的了,可是程序运行起来还是阻塞了,debug跟踪进去发现是卡在select这句话上,select一运行程序就不动了,帮忙看下怎么回事吧~~
u_long ul=1;
ioctlsocket(s,FIONBIO,&ul);
fd_set fdRead;
FD_ZERO(&fdRead);
FD_SET(s,&fdRead);
char* buf=new char[30];
struct sockaddr_vm their_addr={0};
timeval time;
time.tv_sec=1;
int len=sizeof(their_addr);
select(0,&fdRead,NULL,NULL,&time);
if(FD_ISSET(s,&fdRead)){
int rec=recvfrom(s,buf,30,0,(SOCKADDR*)&their_addr,&len);
}
...全文

相关推荐

unix 网络编程实例以及各种疑难解答

UnixSocketProgramming,unix 网络编程实例以及各种疑难解答

zhangchegn

基于require.js的使用(实例讲解)

本篇文章总结下require.js使用方法。 1.为什么使用require.js? 使用之前,我的页面的js是这样的 [removed][removed] [removed][removed] [removed][removed] <script type="text/javascript" s

weixin_38551059

c语言SOCKEt编程指南.pdf

c语言SOCKEt编程指南,C网络编程的内容。比较基础,易懂,

zd0529

Unix编程常见问题解答 高清PDF含书签目录

Unix编程常见问题解答(FAQ/Frequently Asked Questions)(v1.37)(中文版 v0.1.0) 作者:天下一菜 来源:博客园 问题目录 ******** (译者:这里我有意保留原文以便于查询) 1. Process Control 进程控制 1.1 Creating new processes: fork() 创建新进程:fork函数 1.1.1 What does fork() do? fork函数干什么? 1.1.2 What's the difference between fork() and vfork()? fork函数 与 vfork函数的区别在哪里? 1.1.3 Why use _exit rather than exit in the child branch of a fork? 为何在一个fork的子进程分支中使用_exit函数而不使用 exit函数? 1.2 Environment variables 环境变量 1.2.1 How can I get/set an environment variable from a program? 我怎样在程序中获得/设置环境变量? 1.2.2 How can I read the whole environment? 我怎样读取整个环境变量表? 1.3 How can I sleep for less than a second? 我怎样睡眠小于一秒? http://archive.cnblogs.com/a/201848/(第 2/66 页)2011-12-20 9:55:10 Unix编程常见问题解答(FAQ / Frequently Asked Questions)(v1.37)(中文版 v0.1.0) - 博客文库 - 博客园 1.4 How can I get a finer-grained version of alarm()? 我怎样得到一个更细分时间单位的alarm函数版本(译者注:希望alarm 的时间小于一秒)? 1.5 How can a parent and child process communicate? 父子进程如何通信? 1.6 How do I get rid of zombie processes? 我怎样去除僵死进程? 1.6.1 What is a zombie? 何为僵死进程? 1.6.2 How do I prevent them from occuring? 我怎样避免它们的出现? 1.7 How do I get my program to act like a daemon? 我怎样使我的程序作为守护程序运行? 1.8 How can I look at process in the system like ps does? 我怎样象ps程序一样审视系统的进程? 1.9 Given a pid, how can I tell if it's a running program? 给定一个进程号(译者注:pid: process ID),我怎样知道它是个正 在运行的程序? 1.10 What's the return value of system/pclose/waitpid? system函数,pclose函数,waitpid函数 的返回值是什么? 1.11 How do I find out about a process' memory usage? 我怎样找出一个进程的存储器使用情况? 1.12 Why do processes never decrease in size? 为什么进程的大小不缩减? 1.13 How do I change the name of my program (as seen by `ps')? 我怎样改变我程序的名字(即“ps”看到的名字)? 1.14 How can I find a process' executable file? 我怎样找到进程的相应可执行文件? 1.14.1 So where do I put my configuration files then? 那么,我把配置文件放在哪里呢? 1.15 Why doesn't my process get SIGHUP when its parent dies? 为何父进程死时,我的进程未得到SIGHUP信号? 1.16 How can I kill all descendents of a process? 我怎样杀死一个进程的所有派生进程? 2. General File handling (including pipes and sockets) 一般文件操作(包括管道和套接字) 2.1 How to manage multiple connections? 怎样管理多个连接? 2.1.1 How do I use select()? 我怎样使用select()? 2.1.2 How do I use poll()? 我怎样使用poll() ? 2.1.3 Can I use SysV IPC at the same time as select or poll? 我是否可以将SysV 进程间通信 (译者注:IPC: Interprocess Communications) 与select或poll同 时使用? 2.2 How can I tell when the other end of a connection shuts down? 我怎么知道连接的另一端已关闭? 2.3 Best way to read directories? 读目录的最好方法? 2.4 How can I find out if someone else has a file open? 我怎么知道其他人已经打开一个文件? 2.5 How do I `lock' a file? 我怎样锁定一个文件? 2.6 How do I find out if a file has been updated by another process? 我怎么知道一个文件是否已被其他进程更新? 2.7 How does the `du' utility work? “du”工具程序是怎么工作的? 2.8 How do I find the size of a file? 我怎么知道一个文件的大小? 2.9 How do I expand `~' in a filename like the shell does? 我怎样象shell程序一样将一个文件名中含有的“~”展开? 2.10 What can I do with named pipes (FIFOs)? 我能用有名管道(FIFOs)(译者注:FIFO: First In First Oout)干什么? 2.10.1 What is a named pipe? 什么是有名管道? 2.10.2 How do I create a named pipe? 我怎样创建一个有名管道? 2.10.3 How do I use a named pipe? 我怎样使用一个有名管道? 2.10.4 Can I use a named pipe across NFS? 我能基于网络文件系统(译者注:NFS:Network File System)使用有名管道 吗? 2.10.5 Can multiple processes write to the pipe simultaneously? 多个进程能否同时向这个管道写执行写操作? 2.10.6 Using named pipes in applications 在应用程序中使用有名管道。 3. Terminal I/O 终端输入/输出(I/O:input/output) 3.1 How can I make my program not echo input? 我怎样使我的程序不回射输入? 3.2 How can I read single characters from the terminal? 我怎样从终端读取单个字符? 3.3 How can I check and see if a key was pressed? 我怎样检查是否一个键被摁下? 3.4 How can I move the cursor around the screen? 我怎样将光标在屏幕里移动? http://archive.cnblogs.com/a/201848/(第 3/66 页)2011-12-20 9:55:10 Unix编程常见问题解答(FAQ / Frequently Asked Questions)(v1.37)(中文版 v0.1.0) - 博客文库 - 博客园 3.5 What are pttys? pttys(pttys:Pseudo-teletypes)是什么? 3.6 How to handle a serial port or modem? 怎样控制一个串行口和调制解调器(译者注:modem: modulate-demodulate) 3.6.1 Serial device names and types 串行设备和类型 3.6.2 Setting up termios flags 设置termios的标志位 3.6.2.1 c_iflag 3.6.2.2 c_oflag 3.6.2.3 c_cflag 3.6.2.4 c_lflag 3.6.2.5 c_cc 4. System Information 系统信息 4.1 How can I tell how much memory my system has? 我怎样知道我的系统有多少存储器容量? 4.2 How do I check a user's password? 我怎样检查一个用户的口令? 4.2.1 How do I get a user's password? 我怎样得到一个用户的口令? 4.2.2 How do I get shadow passwords by uid? 我怎样通过用户号(译者注:uid: User ID)得到阴影口令文件中的口令? 4.2.3 How do I verify a user's password? 我怎样核对一个用户的口令? 5. Miscellaneous programming 编程杂技 5.1 How do I compare strings using wildcards? 我怎样使用通配字符比较字符串? 5.1.1 How do I compare strings using filename patterns? 我怎样使用文件名通配模式比较字符串? 5.1.2 How do I compare strings using regular expressions? 我怎样使用正则表达式比较字符串? 5.2 What's the best way to send mail from a program? 什么是在程序中发送电子邮件的最好方法? 5.2.1 The simple method: /bin/mail 简单方法:/bin/mail 5.2.2 Invoking the MTA directly: /usr/lib/sendmail 直接启动邮件传输代理(译者注:MTA: mail transfer agent):/usr/ bin/sendmail 5.2.2.1 Supplying the envelope explicitly 显式提供收件人信息 5.2.2.2 Allowing sendmail to deduce the recipients 允许sendmail程序根据邮件内容分析出收件人 6. Use of tools 工具的使用 6.1 How can I debug the children after a fork? 我怎样调试fork函数产生的子进程? 6.2 How to build library from other libraries? 怎样通过其他库文件建立新的库文件? 6.3 How to create shared libraries / dlls? 怎样创建动态连接库/dlls? 6.4 Can I replace objects in a shared library? 我能更改一个动态连接库里的目标吗? 6.5 How can I generate a stack dump from within a running program? 我能在一个运行着的程序中生成堆栈映象吗?

cenjoyer

Socket通信(TCP)非阻塞模式-select模型

这个范例是个基于TCP协议的非阻塞模式下的SOCKET通信,应该非常具有代表性了,分为服务器端和客户端。

guoyuanjing
评论 8
收藏 已收藏
分享
返回顶部
magicing
网络编程 18,356 成员 64,161 内容