使用upd socket(SOCK_DGRAM)的时候,recvform超时的问题

本文档探讨了在使用UDP Socket(SOCK_DGRAM)进行数据传输时遇到的recvfrom超时问题。当连接本地地址并设置SO_RCVTIMEO选项时,会立即超时,而连接其他机器地址则能正常工作。作者指出这个问题的诡异行为,并提出疑问为何没有更多人注意到此现象。

#include "stdafx.h"
#pragma comment(lib,"Ws2_32.lib")
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
 WSADATA wsaData;
 int Port = 27015;
 int  BufLen = 1024;
 sockaddr_in SenderAddr;
 int SenderAddrSize = sizeof(SenderAddr);

 //-----------------------------------------------
 // Initialize Winsock
 WSAStartup(MAKEWORD(2,2), &wsaData);
 
 SOCKET socket1;
 struct sockaddr_in server;
 int len =sizeof(server);
 server.sin_family=AF_INET;
 server.sin_port=htons(1000);                      ///server的监听端口
 server.sin_addr.s_addr=inet_addr("192.168.250.17"); ///server的地址

 socket1=socket(AF_INET,SOCK_DGRAM,0);

 int time=1000;
 setsockopt(socket1,SOL_SOCKET,SO_RCVTIMEO,(char*)&time, sizeof(time));

  char buffer[1024]="/0";
  printf("input message/n");
  scanf("%s",buffer);
  sendto(socket1,buffer,sizeof buffer,0,(struct sockaddr*)&server,len);

  sockaddr_in rvaddr;
  int nrvaddr=sizeof(rvaddr);
  recvfrom(socket1,buffer,sizeof buffer,0,(struct sockaddr*)&rvaddr,&nrvaddr);

 closesocket(socket1);

 return 0;
}

如果你连接的是本机地址,那setsockopt设置了SO_RCVTIMEO会立刻超时。但是如果inet_addr填入的是别的机器的地址这个函数就正常了。

为什么没有人提出注明呢?我就觉得我的程序一下正常一下不正常。。。。。

### `UPD_IFENTRY_FLAG_NONE = 0` 的含义及作用 `UPD_IFENTRY_FLAG_NONE = 0` 通常用于表示没有设置任何更新标志。在编程中,标志位常常被用来表示某种状态或者条件是否满足。当 `UPD_IFENTRY_FLAG_NONE` 被定义为 0 时,意味着它代表一个空状态,即没有特定的更新操作被标记。 以下是一个简单的示例,展示了如何使用这个标志: ```c #define UPD_IFENTRY_FLAG_NONE 0 int updFlag = UPD_IFENTRY_FLAG_NONE; if (updFlag == UPD_IFENTRY_FLAG_NONE) { // 表示没有更新标志被设置 printf("No update flags are set.\n"); } ``` ### `UPD_IFENTRY_FLAG_DEL = 1 << UPD_IFENTRY_DEL` 的含义及作用 `1 << UPD_IFENTRY_DEL` 是一个左移操作。左移操作将一个二进制数向左移动指定的位数,每左移一位相当于乘以 2。`UPD_IFENTRY_DEL` 应该是一个整数常量,表示要左移的位数。 `UPD_IFENTRY_FLAG_DEL` 通常用于表示删除相关的更新标志。通过左移操作,可以将一个特定的二进制位设置为 1,从而创建一个唯一的标志。 以下是一个示例: ```c #define UPD_IFENTRY_DEL 2 #define UPD_IFENTRY_FLAG_DEL (1 << UPD_IFENTRY_DEL) int updFlag = 0; updFlag |= UPD_IFENTRY_FLAG_DEL; // 设置删除标志 if (updFlag & UPD_IFENTRY_FLAG_DEL) { // 表示删除标志被设置 printf("Delete update flag is set.\n"); } ``` 在这个示例中,`1 << UPD_IFENTRY_DEL` 会将二进制数 `0000 0001` 左移 2 位,得到 `0000 0100`。然后将这个标志与 `updFlag` 进行按位或操作,将删除标志设置到 `updFlag` 中。最后通过按位与操作检查删除标志是否被设置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值