recv不等待是因为你使用的是非阻塞socket,换而你使用阻塞socket一样需要等待。
recv的recvfrom是可以替换使用的,只是recvfrom多了两个参数,可以用来接收对端的地址信息,这个对于udp这种无连接的,可以很方便地进行回复。而换过来如果你在udp当中也使用recv,那么就不知道该回复给谁了,如果你不需要回复的话,也是可以使用的。另外就是对于tcp是已经知道对端的,就没必要每次接收还多收一个地址,没有意义,要取地址信息,在accept当中取得就可以加以记录了。
原文链接: http://blog.youkuaiyun.com/jiangzhuzhu/article/details/5687234
int socket(int domain,int type,int protocol);
(1):如果想单独处理TCP,UDP或者ICMP,可用AF_INET, 第三个参数用IPPROTO_TCP, IPPROTO_UDP等
(2):如果想对各种IP包进行处理,则用AF_PACKET/PF_PACKET,第三个参数用htons(ETH_P_IP)
(3):如果想处理一切链路层上的包(IP,RARP,ARP等),则用AF_PACKET/PF_PACKET,第三个参数用 htons(ETH_P_ALL)
分类: C/C++
另外,如果出现EINTR即errno为4,错误描述Interrupted system call,操作也应该继续。
最后,如果recv的返回值为0,那表明连接已经断开,我们的接收操作也应该结束。
四、阻塞 非阻塞 判别
1、非阻塞的设置方法
原文链接:http://blog.sina.com.cn/s/blog_4b029ef30100nxcb.html
int flag;
flag = fcntl(fd, F_GETFL, 0);
if(0 > flag) .......;
flag |= O_NONBLOCK;
fcntl(fd, F_SETFL, flag);
2、判别方法
附下图 说明 是 阻塞 还是非阻塞 问题:
五、