求BCB中UDPSocket的使用示例。

凌波微搏 2004-11-09 10:15:46
在Borland自己带的Example里面没有找到相关的示例。

我现在要不断的接收数据,然后进行处理。请各位给点建议。
...全文
1042 36 打赏 收藏 转发到动态 举报
写回复
用AI写文章
36 条回复
切换为时间正序
请发表友善的回复…
发表回复
凌波微搏 2004-11-10
  • 打赏
  • 举报
回复
不知道 shadowstar(天作棋盘星作子,谁人敢下?) 今天来了没有,期待再次给我解答。
lidawen 2004-11-10
  • 打赏
  • 举报
回复
學習
凌波微搏 2004-11-10
  • 打赏
  • 举报
回复
谢谢了 谢谢 shadowstar(天作棋盘星作子,谁人敢下?) 此帖到此为止。我先研究,有问题再问你。
shadowstar 2004-11-10
  • 打赏
  • 举报
回复
如果你要等的话,再说我把主要的实现步骤都说了,你试着写一个就行了
shadowstar 2004-11-10
  • 打赏
  • 举报
回复
周六之前吧
凌波微搏 2004-11-10
  • 打赏
  • 举报
回复
shadowstar(天作棋盘星作子,谁人敢下?)
可否帮忙写一个简单的示例给我?
shadowstar 2004-11-10
  • 打赏
  • 举报
回复
那就不知道了
凌波微搏 2004-11-10
  • 打赏
  • 举报
回复
是的,我的也是,但是很多人说BCB6自带的版本有BUG,必须要更新到新版本,不然会有问题。
shadowstar 2004-11-10
  • 打赏
  • 举报
回复
什么版本呀?我的BCB6安装好了就有啊
凌波微搏 2004-11-10
  • 打赏
  • 举报
回复
Indy不是要配置么?我没有配置成功。
凌波微搏 2004-11-10
  • 打赏
  • 举报
回复
不知 shadowstar(天作棋盘星作子,谁人敢下?) 可否帮忙写一个Demo?我发了消息给你,是否可以直接向您请教?
shadowstar 2004-11-10
  • 打赏
  • 举报
回复
要安装么?
凌波微搏 2004-11-10
  • 打赏
  • 举报
回复
哦。。谢谢了。我也试图想使用Indy组件,但是Indy安装的时候没有成功。
shadowstar 2004-11-10
  • 打赏
  • 举报
回复
说过啦……

如果你想指定本地端口,需要从TUdpSocket继承一个新类(TMyUdpSocket),重载它的Open方法。
绑定到本地端口


其实用Indy的TIdUDPServer会更简单一些
凌波微搏 2004-11-10
  • 打赏
  • 举报
回复
感谢 shadowstar(天作棋盘星作子,谁人敢下?)
如果按照您上面说的,一个UDPSocket的话只能接收来自于一个发送端的数据了?我一开始以为UDPSocket只要监听本地端口,就会接收来自于任意发送端的数据,那么,如果是这样的话,我现在要同时接收来自于多个发送端的数据,该如何操作呢?
shadowstar 2004-11-10
  • 打赏
  • 举报
回复
我想问一下,这个线程岂不是一直在不停的接收,那么,这个接收线程所占用的系统资源就非常的多了。别的线程不久会出问题?如果我让它定时的每隔一段时间读一次,那么如果在两个间隔期间发过来的数据会不会丢掉?如果是的话,就必须谨慎的权衡一下间隔的时间了。

=============

不用担心线程的问题,每个Windows应用程序都在做着类似的事情……
shadowstar 2004-11-10
  • 打赏
  • 举报
回复
上面是初始化的代码,我想问一下,RemoteHost是不是指定了远程发送端的IP,RemotePort是不是指定了远程发送端的端口?这里只接收从RemoteHost指定的Ip和RemotePort指定的端口发送出来的数据?

按照你下面要重载的说法,难道本地的端口号是随机的?而不能指定?那么UdpSocket的LocalHost,和LocalPort又是做什么用的,难道不是用来指定本地地址和Port用的么?

而我上次问了一个相关的人士,他们告诉我RemoteHost和RemotePort是用在要发送UDP包的情况下,指定发送目的机器的IP和端口的。

不知道到底是哪种说法呢?

================

Active = true;
则与远端主机建立了一个连接,这时可以用ReceiveBuf,和SendBuf方法;
给Active赋值为true后,改变RemoteHost和RemotePort不能改变远端地址;
但可以使用ReceiveFrom, SendTo指定远端主机地址;
LocalHost和LocalPort对TUdpSocket来说是没有用的,本地端口是随机的;
kingzai 2004-11-09
  • 打赏
  • 举报
回复
Client端的,稍微修改就是Server端的。


#include "windows.h"
#include "stdio.h"
#include "winsock2.h"
#pragma link "WS2_32.LIB"

#define PORT 4096

void broadcast();
void to_point();

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
WSADATA wsadata;

if(WSAStartup(0x101,&wsadata) != 0) return 0;
broadcast();
to_point();
WSACleanup();
return 1;
}

void to_point()
{
sockaddr_in socket_out;
sockaddr_in socket_in;
sockaddr_in socket_from;
SOCKET s;
BOOL optval = true;
char buffer[2048];
int from_len;
WSAEVENT event_obj;
int size;

memset(&socket_in,0,sizeof(socket_in));
socket_in.sin_family = AF_INET;
socket_in.sin_addr.s_addr = INADDR_ANY;
socket_in.sin_port = htons(PORT);
socket_out.sin_family = AF_INET;
socket_out.sin_addr.s_addr = 0x580aa8c0;
s = socket(AF_INET,SOCK_DGRAM,0);
if(s == INVALID_SOCKET) return;
if(bind(s,(sockaddr FAR*)&socket_in,sizeof(socket_in)) != 0)
{
closesocket(s);
return;
}
if(setsockopt(s,SOL_SOCKET,SO_RCVBUF,(char FAR*)&optval,sizeof(optval)) == SOCKET_ERROR)
{
closesocket(s);
return;
}
from_len = sizeof(SOCKADDR);
event_obj = WSACreateEvent();
if(event_obj == WSA_INVALID_EVENT)
{
closesocket(s);
return;
}
if(WSAEventSelect(s,event_obj,FD_READ) == SOCKET_ERROR)
{
closesocket(s);
WSACloseEvent(event_obj);
return;
}
socket_out.sin_port = htons(PORT);
if(sendto(s,"Hello 192.168.10.88",20,0,(sockaddr FAR*)&socket_out,sizeof(socket_out)) == SOCKET_ERROR)
{
closesocket(s);
WSACloseEvent(event_obj);
return;
}
switch(WSAWaitForMultipleEvents(1,&event_obj,true,10,true))
{
default:
MessageBox(NULL,"Does not answer","Notice",0);
break;
case WSA_WAIT_EVENT_0:
size = recvfrom(s,(char FAR*)buffer,2048,0,(sockaddr FAR*)&socket_from,(int FAR*)&from_len);
if(size > 0)
{
MessageBox(NULL,buffer,"Answer",0);
}
}
closesocket(s);
WSACloseEvent(event_obj);
}

void broadcast()
{
sockaddr_in socket_out;
sockaddr_in socket_in;
sockaddr_in socket_from;
SOCKET s;
BOOL optval = true;
char buffer[2048];
int from_len;
WSAEVENT event_obj;
int size;

memset(&socket_in,0,sizeof(socket_in));
socket_in.sin_family = AF_INET;
socket_in.sin_addr.s_addr = INADDR_ANY;
socket_in.sin_port = htons(PORT);
socket_out.sin_family = AF_INET;
socket_out.sin_addr.s_addr = INADDR_BROADCAST;
s = socket(AF_INET,SOCK_DGRAM,0);
if(s == INVALID_SOCKET) return;
if(bind(s,(sockaddr FAR*)&socket_in,sizeof(socket_in)) != 0)
{
closesocket(s);
return;
}
if(setsockopt(s,SOL_SOCKET,SO_BROADCAST,(char FAR*)&optval,sizeof(optval)) == SOCKET_ERROR)
{
closesocket(s);
return;
}
from_len = sizeof(SOCKADDR);
event_obj = WSACreateEvent();
if(event_obj == WSA_INVALID_EVENT)
{
closesocket(s);
return;
}
if(WSAEventSelect(s,event_obj,FD_READ) == SOCKET_ERROR)
{
closesocket(s);
WSACloseEvent(event_obj);
return;
}
socket_out.sin_port = htons(PORT);
if(sendto(s,"Hello World",12,0,(sockaddr FAR*)&socket_out,sizeof(socket_out)) == SOCKET_ERROR)
{
closesocket(s);
WSACloseEvent(event_obj);
return;
}
switch(WSAWaitForMultipleEvents(1,&event_obj,true,10,true))
{
default:
MessageBox(NULL,"Does not answer","Notice",0);
break;
case WSA_WAIT_EVENT_0:
size = recvfrom(s,(char FAR*)buffer,2048,0,(sockaddr FAR*)&socket_from,(int FAR*)&from_len);
if(size > 0)
{
MessageBox(NULL,buffer,"Answer",0);
}
}
closesocket(s);
WSACloseEvent(event_obj);
}
凌波微搏 2004-11-09
  • 打赏
  • 举报
回复
还有,在你接收线程里面是如下的语句。
void __fastcall TUdpThread::Execute()
{
//---- Place thread code here ----
while (!Terminated)
{
Form1->UdpSocket1->ReceiveBuf(Buf, BufSize);
}
}

我想问一下,这个线程岂不是一直在不停的接收,那么,这个接收线程所占用的系统资源就非常的多了。别的线程不久会出问题?如果我让它定时的每隔一段时间读一次,那么如果在两个间隔期间发过来的数据会不会丢掉?如果是的话,就必须谨慎的权衡一下间隔的时间了。
凌波微搏 2004-11-09
  • 打赏
  • 举报
回复
RemoteHost = "192.168.0.1";
RemotePort = "123";
Active = true;

上面是初始化的代码,我想问一下,RemoteHost是不是指定了远程发送端的IP,RemotePort是不是指定了远程发送端的端口?这里只接收从RemoteHost指定的Ip和RemotePort指定的端口发送出来的数据?

按照你下面要重载的说法,难道本地的端口号是随机的?而不能指定?那么UdpSocket的LocalHost,和LocalPort又是做什么用的,难道不是用来指定本地地址和Port用的么?

而我上次问了一个相关的人士,他们告诉我RemoteHost和RemotePort是用在要发送UDP包的情况下,指定发送目的机器的IP和端口的。

不知道到底是哪种说法呢?
加载更多回复(16)

1,316

社区成员

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

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