关于UDP自动跨越进程处理,不知道是BUG还是特性!?

Baesky 2010-05-24 01:47:43
写了2个基于UDP通讯的小demo
一个是sender,一个是remote
两个程序基本一样,不同之处在于
sender中初始化代码如下:
void init_winsock()
{
WSAStartup(MAKEWORD(2, 2), &WinSock);

if (LOBYTE(WinSock.wVersion) != 2 || HIBYTE(WinSock.wVersion) != 2)
{
WSACleanup();
return;
}

Socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);

ZeroMemory(&RemoteAddress, sizeof(RemoteAddress));
RemoteAddress.sin_family = AF_INET;
RemoteAddress.sin_port = REMOTE_PORT;
RemoteAddress.sin_addr.s_addr = inet_addr(REMOTE_ADDRESS);
}

remote中初始化的代码如下:
void init_winsock()
{
WSAStartup(MAKEWORD(2, 2), &WinSock);

if (LOBYTE(WinSock.wVersion) != 2 || HIBYTE(WinSock.wVersion) != 2)
{
WSACleanup();
return;
}

Socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);

ZeroMemory(&RemoteAddress, sizeof(RemoteAddress));
RemoteAddress.sin_family = AF_INET;
RemoteAddress.sin_port = REMOTE_PORT;
//RemoteAddress.sin_addr.s_addr = inet_addr(REMOTE_ADDRESS);
bind(Socket, (sockaddr*)&RemoteAddress, sizeof(RemoteAddress));
CreateThread(NULL, 0, RecvThread, NULL, 0, NULL);
}

DWORD WINAPI RecvThread(LPVOID Whatever)
{
while(true)
{
BALL Recv;
recvfrom(Socket, (char*)&Recv, sizeof(BALL), 0, (sockaddr*)&RemoteAddress, &SizeInt);
Ball = Recv;
}
}

当然,为了方便测试,两者IP是我的本机IP.
我的本意是控制sender的球体,在remote中显示实时的位置,但是现在的问题是,我在remote中移动球体,sender也可以看到.
我只在remote中调用了recvfrom();但是目前看来,他好像也"帮忙"处理了sender中的数据接收.
请问这是什么原因?是winsock中强大的一种特性?还是我的逻辑哪里有误?请不吝赐教!
...全文
122 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
Baesky 2010-05-24
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 zzdmfk 的回复:]

不是每次都是这样吧,是不是有一次可以,有一次不可以看到?绑定同一端口和IP,都有接受函数,应该都可以收到,只是如果某个进程先取走了缓冲区中的数据,另一个就取不到了。不过不太肯定。
[/Quote]
每次都这样,而且只有一个程序调用recvfrom,另一个没有调用过.
路人乙2019 2010-05-24
  • 打赏
  • 举报
回复
不是每次都是这样吧,是不是有一次可以,有一次不可以看到?绑定同一端口和IP,都有接受函数,应该都可以收到,只是如果某个进程先取走了缓冲区中的数据,另一个就取不到了。不过不太肯定。
Baesky 2010-05-24
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 wwwllg 的回复:]

不能用同一个port
你运行的时候,加一个参数,这样就是不同的port了。就不会出现你的问题了。
[/Quote]
同一个PORT引发的这个issue,算是本身机制就是这样还是?请详细告之。。。。解我心中疑惑。。。
UDX协议 2010-05-24
  • 打赏
  • 举报
回复
不能用同一个port
你运行的时候,加一个参数,这样就是不同的port了。就不会出现你的问题了。
Baesky 2010-05-24
  • 打赏
  • 举报
回复
是的,同一个PORT。
请问大大我是否可以这么理解:winsock是一个独立的模型,类似于内核对象,他的使用不会受到进程的限制,如果一个127.0.0.1的IP帮到12345这个端口上,A和B都使用同一个IP和端口(或者仅仅是端口起决定作用?),那么A和B即使是风马牛不想提的两个程序,也会公用那个接收处理函数?
我一直想不通的是,当sender发送数据时候,会触发remote的recvfrom调用,但是这个调用怎么可能控制到另一个进程的数据呢?这也太“危险”了吧?加入我想HOOK哪个UDP程序,找到端口连HOOK都不用下不久拦截到了。。。。
UDX协议 2010-05-24
  • 打赏
  • 举报
回复
查看一下,两个程序是不是用的是同一个port?

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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