UDP方式,接收数据不正常的问题

dablyo 2005-12-16 11:47:47
CBuilder6编写的,同一个程序,既收也发,分别运行在两台机器上,使用相同的端口,发现接收数据不太稳定,常出现接收程序收不到数据的情况。两边我用Sniff验证,发端确实发出,接收方也收到,数据的发送量和大小都不大。使用WSAAsyncSelect方式

SOCKADDR_IN from_sin,to_sin;
from_sin.sin_family = AF_INET;
from_sin.sin_port = htons(5000);
from.sin.sin_addr.s_addr = inet_addr("........//本机地址
to_sin.sin_family = AF_INET;
to_sin.sin_port = htons(5000);
to_sin.sin_addr.s_addr = inet_addr("..........//对端地址

SOCKET tempsock;
tempsocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);

BOOL TempBool = TRUE;
setsockopt(tempsocket,SOL_SOCKET, SO_REUSEADDR,(char *)&TempBool, sizeof(BOOL));

bind(tempsocket, (PSOCKADDR)&from_sin, sizeof(from_sin));

WSAAsyncSelect(tempsock,hwnd,WSA_READ,FD_READ);
//#define WSA_READ (WM_USER + 1001)

//增加connect调用的原因是编程方便,这里也可以不用
connect(tempsock,(PSOCKADDR)&to_sin,sizeof(to_sin);

//接收HandleWsaRead
char buf[1024];
int tolen = sizeof(SOCKADDR_IN);
len = recvfrom(tempsocket,buf,1024,FALSE,(PSOCKADDR)&(to_sin),&tolen);

//发送
send(tempsocket,buf,sizeof(buf),0);

//后来改用线程,阻塞方式,去掉select,结果还是一样
...全文
367 3 打赏 收藏 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2006-01-02
  • 打赏
  • 举报
回复
mark
dablyo 2005-12-16
  • 打赏
  • 举报
回复
1,是这样的,上面的代码只是我写的一个验证程序,实际的程序需要最多和255个对端收发数据,使用相同的端口号--不一定是5000,我使用一个描述socket状态的长度为255的数组存放信息。我后来屏蔽掉设置SO_REUSEADDR的代码,结果没有变化。
2,这样做确实可以增加效率,但是我只是使用按钮调用send发送几个字符串而已,应该不是导致我收不到的原因
3,recvfrom调用(这里也可以使用recv,如果前面使用了connect了的话)是放在WSA_READ消息的处理函数HandleWsaRead。


谢谢boyla的关心。
土著巫师 2005-12-16
  • 打赏
  • 举报
回复
1、我不明白你为什么在要执行这个函数,如果不要在同一个IP和PORT上绑定套接字,完全没有必要。setsockopt(tempsocket,SOL_SOCKET, SO_REUSEADDR,(char *)&TempBool, sizeof(BOOL));(可能影起其它负面作用)

2、char buf[1024]?如果你不能保证数据量一定在1024长度以内,建立放在,我通常的做做一个new char[64*1024],以后重复使用,最后delete[]掉。

3、既然用了异步选择I/O模型,就没有必要主动去recvfrom了,而是在你收到系统返回的通知消息时再执行这个函数。

1,317

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧