总算找到UdpSocket组件收发信息的问题,证明该组件收发信息无问题

HelloBear188 2007-12-17 09:19:34
前几天需要用到UdpSocket组件,但搜遍了网络也没有找到一个完整的可参考的例子.并且普遍认为该组件有问题不能实现收发信息.对此做了相关试验,证明该组件能正常收发信息.
测试代码如下:
客户端:
char buff[10] = {'T','e','s','t','\0'}; //发送的测试信息
u_short portx = StrToInt(Edit1->Text); //端口号
sockaddr_in addr;

addr.sin_family = AF_INET;
addr.sin_port = htons(portx); //这里是关键要用htons函数进行转换格式,许多例子中不能收就是这个问题,它引起了不能正确设置端口号,造成服务端不能接收
addr.sin_addr.S_un.S_addr = inet_addr(Edit2->Text.c_str()); //服务器地址
UdpSocket1->SendTo(buff,10,addr,0);

服务器端:
char Buffer[20];
UdpSocket1->ReceiveBuf(Buffer, 20, 0);
Memo1->Lines->Add(StrPas(Buffer));
另外我还不会怎么设置固定端口号,请路过的朋友指点一二.
...全文
454 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
新地球 2011-08-12
  • 打赏
  • 举报
回复
谁能给个完整的好例子啊?还有用onUdpSocket有什么好处啊?哪位大哥具体说一下!
僵哥 2007-12-18
  • 打赏
  • 举报
回复
1.调用bind进行绑定,方法跟tcp当中的server绑定没有区别。
2.有两种办法,最简单的办法就是SendTo当中所指定的,或者RecvFrom当中返回的。另外,对于有连接的可以通过GetPeerName取得。
僵哥 2007-12-18
  • 打赏
  • 举报
回复
是的。
HelloBear188 2007-12-18
  • 打赏
  • 举报
回复
首先向楼上的以及可能成为楼下的朋友表示感谢,感谢你们的热心支持.目前我初次使用UdpSocket控件,经验不足,需要解决两个问题 1.该怎样进行端口绑定操作. 2.如果客户端发来数据,怎样取得对方IP和Port.以便于我能够发送消息给客户端. 虽然我可以通过Indy的UDP控件来完成,但由于我的程序中静态调用了Iphlpapi.dll会和该组件发生冲突, 故需使用UdpSocket.
僵哥 2007-12-18
  • 打赏
  • 举报
回复
固定端口号,就是进行bind,不管服务器端,还是客户端,都可以使用(服务器也可以使用随机端口,即bind到0端口上,让系统自动分配一个),特别是Udp客户端,在很多时候由于Udp本身服务器端和客户端的概念是比较模糊的,仅仅只是谁先发起请求的区别。其实即便你不显示地bind,在sendto的过程当中,系统也会去做一个绑定操作(只是绑定到了一个随机的端口上面)。而显示绑定的一个好处是,在有防火墙的系统当中,可以很好地配置端口。

另外,对于udp传输,如果事先有进行connect,在效率上面会有不小提高,而要connect操作。

对于楼主所提到的端口需要使用htons,这个归结于x86系列的主机字节序与网络字节序的差异性。
HelloBear188 2007-12-18
  • 打赏
  • 举报
回复
unsigned 兄,非常感谢你的回复, 看了TUdpSocket的继承关系, 它最后继承的是TCustomIpClient, 不知是否就是这个原因了。再次表示感谢。
僵哥 2007-12-18
  • 打赏
  • 举报
回复
TUdpsocket有点问题,当设置Active的时候,就会主动执行connect,而connect就会主动bind到一个随机的端口,从而无法再次bind到指定端口。
僵哥 2007-12-18
  • 打赏
  • 举报
回复
procedure TForm2.Button1Click(Sender: TObject);
var
addr: TSockAddr;
begin
if UdpSocket1.Active then
begin
addr := UdpSocket1.GetSocketAddr(UdpSocket1.LocalHost, UdpSocket1.LocalPort);
if bind(UdpSocket1.Handle, addr, sizeof(addr))= SOCKET_ERROR then
begin
//绑定失败WSAGetLastError
end;
end
else
begin
//请先激活UdpSocket;
end;
end;
HelloBear188 2007-12-18
  • 打赏
  • 举报
回复
unsigned 你好,按照你所说的利用Bind 方法进行绑定, 我在UdpSocket组件的方法中找不到, 恕我愚钝, 能否给出一示例代码, 另外TcpServer组件直接在LocalPort属性中指定端口号就可以绑定了, 而在UdpSocket中却不能这样做. 谢谢你! 看了一些别人的贴子, 大意是说要对UdpSocket的Open方法重载才行不知是否.
我不懂电脑 2007-12-17
  • 打赏
  • 举报
回复
设置固定端口号
作为服务器才需要这样,在udpsocket里有个port可以设置
JuncoZhan 2007-12-17
  • 打赏
  • 举报
回复
客户端早就成功了,但编服务器不行,我一气之下自己写了个udpsocket一样的控件,也没有多少代码……
HelloBear188 2007-12-17
  • 打赏
  • 举报
回复
楼上的朋友,我设置过UdpSocket控件中的LocalPort,但运行程序后仍是自动分配的端口号,不知你所指的是哪个Port设置,麻烦仔细说一下,谢谢

1,316

社区成员

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

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