udp通信
我做的一个udp通信程序,在机子只有一个网卡一个ip地址的情况下一切正常,可是当出现多ip的时候有时候会不正常,因为我必须将本机ip地址(和对方建立通信的那个ip告知对方),可是现在有多个,我就不知道应该到底发那个了,! 我如下操作
if (getsockname(guiSockfd, (struct sockaddr *)&host_addr, &socklen) == 0)
{
UINT16 gusIPPort = ntohs(host_addr.sin_port) ;
//host_addr.sin_addr.s_addr; (如此去IP始终为空)
gusLocalPort = gusIPPort;
.....
}
我只能得到本机和对方的端口,ip地址却始终为空! 怎么办呢?我求大家了!
注意: 是UDP,不是TCP!
问题点数:0、回复次数:8Top
1 楼boxban(冻酸梨)回复于 2004-12-03 09:02:15 得分 0
先调用bind绑定指定的IPTop
2 楼darkstar21cn(≮天残≯无畏)(死亡进行时)回复于 2004-12-03 09:21:55 得分 0
int recvfrom(
SOCKET s,
char* buf,
int len,
int flags,
struct sockaddr* from,
int* fromlen
);
////windows
from
[out] Optional pointer to a buffer in a SOCKADDR structure that will hold the source address upon return.
////linux
If from is not NULL, and the underlying protocol provides the source
address, this source address is filled in. The argument fromlen is a
value-result parameter, initialized to the size of the buffer associ-
ated with from, and modified on return to indicate the actual size of
the address stored there.
接受方使用这个方法接受数据,就可以从from里得到发送方的ip及端口了。一般情况下,发送使用哪个ip和端口是由操作系统控制的(发送端口可以指定,但是没有试过指定发送ip的),在没有连接以前是不可知的。
不知道楼主为什么需要这个需求。希望这个能帮得上你。Top
3 楼haibozhang(老婆要吃土豆,可是我没钱了,怎么办!)回复于 2004-12-03 09:26:24 得分 0
谢谢
我们的实现是这样的: 比如登陆系统的时候我们连接服务器,连接完以后发送登陆用户的命令请求给工作站,工作站收到命令后判断,然后将此用户的ID和此IP帮定,以便工作站给我们回消息的时候根据用户的ID就能回复到相应的机子上,不至于发到别的机子上面! 在用户退出时,需要注销此用户.
所以我们现在在登陆的时候就给服务器发送了一个本机的IP地址,可是出现多IP的时候就挂了(呵呵),也许时我们当初的实现有问题,可是现在只能这样了,不知道有没有方法做到我上面的要求呢!Top
4 楼boxban(冻酸梨)回复于 2004-12-03 09:53:35 得分 0
你的描述有点混乱:(
一会服务器,一会工作站,一会我们,都谁跟谁呀
如果工作站就是服务器,那根本就不用告诉它客户端的IP:用recvfrom自然可以取到。除非是特别应用环境,否则客户端没有必要把自己的IP显式地告诉服务器。
Top
5 楼yeehya(老汉了)回复于 2004-12-03 10:08:51 得分 0
到底是"服务器"有多ip还是"客户端"有多ip啊?
服务器端多ip还真的不好说.看网络编程书上提到用dns查找主机名,验证服务器的名字,而不是ip地址,没做过...
客户端直接指定需要的ip,甚至发送所有的ip.Top
6 楼haibozhang(老婆要吃土豆,可是我没钱了,怎么办!)回复于 2004-12-03 11:35:15 得分 0
客户端是多IP,我现在必须给服务器发本机IP, 不错! 用recvfrom自然可以取到。,但是那样的话,我们发到工作站的时候,每一包数据到要检查,会很慢!Top
7 楼boxban(冻酸梨)回复于 2004-12-07 19:12:59 得分 0
如果是Windows系统,推荐你用下面几个API来发现最佳IP:
GetBestRoute, GetAdaptersInfo, GetBestInterfaceTop
8 楼ljhnew(Lemon Tree)回复于 2004-12-07 21:10:39 得分 0
先用bind到INADDR_ANY地址上,因为你采用UDP,在服务器上采用被动“连接”,用recvfrom可以得到客户机的IP和port,在客户端采用主动“连接”,可以指定连接的IP,至于报文发送时所采用的IP地址由操作系统的“路由”来决定。你可以用route来查看你的系统的路由信息。Top




