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

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#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填入的是别的机器的地址这个函数就正常了。

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

### UDP与TCP通信的主要区别 #### 协议特性对比 UDP是一种无连接的传输协议,它不需要在数据传输前建立连接即可直接发送数据[^3]。相比之下,TCP是一个面向连接的协议,在实际的数据交换之前必须先完成三次握手以建立可靠的连接[^1]。 #### 可靠性方面 TCP提供了一种可靠的服务模型,能够确保数据按照正确的顺序到达目的地,并且具备错误检测以及自动重发的功能来处理丢失或者损坏的数据包[^2]。而UDP则不具备这些保障措施,它的设计目标是在尽可能短的时间内把消息送达给对方,即便这意味着部分信息可能会被遗漏或乱序到达[^4]。 #### 性能表现 由于额外增加了诸如确认应答、超时重传等一系列复杂的操作流程,使得基于TCP的应用程序通常会有更高的延迟时间作为代价换取更高质量的信息传递体验。相反地,采用UDP可以显著减少网络交互中的等待周期从而获得更快的速度响应效果,这对于某些特定类型的业务需求来说是非常重要的优势所在。 #### 首部开销 从封装结构上看,标准情况下每个TCP段至少含有20字节固定长度头部字段用来描述源端口号/目的端口号以及其他必要的控制参数等信息;与此同时,一个典型的UPD用户数据报仅仅消耗掉固定的8个八位组空间用于携带基本地址指示符等内容而已^。 --- ### 应用场景分析 #### TCP典型用途 对于那些强调精确性和完整性的场合而言——比如远程登录服务器(SSH)、下载大型文件资源(HTTP GET请求)、收发电子邮件信件(SMTP, IMAP protocols)等等,则普遍会选择依赖于TCP所提供的全面保护机制来进行高效稳定的工作运行环境构建工作. #### UDP主要领域 另一方面,在追求极致速率的同时又能接受一定程度上牺牲准确率的情况下——例如在线音视频通话平台(ZOOM meetings), 实况电竞比赛直播信号传送(Fortnite gaming sessions)- 这类项目往往倾向于利用UDP带来的简洁明快风格去满足其特殊的技术指标要求. ```python import socket def create_tcp_socket(): tcp_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) return tcp_sock def create_udp_socket(): udp_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) return udp_sock ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值