我的目的是由a机发送广播,b机收到后将自己的ip地址发送给a机,现在遇到的问题是a机收不到b机的返回信息,代码如下:a机:
SOCKET s;
sockaddr_in a,addrto;
WSADATA wsdata;
BOOL bsocket;
WSAStartup(0x0202,&wsdata);
char buf[256]; s=WSASocket(AF_INET,SOCK_DGRAM,0,NULL,0,WSA_FLAG_OVERLAPPED);
bsocket=TRUE; addrto.sin_family=AF_INET;
    addrto.sin_addr.s_addr=INADDR_BROADCAST;
addrto.sin_port=htons(5050);
bool opt=true;

setsockopt(s,SOL_SOCKET,SO_BROADCAST,(char FAR *)&opt,sizeof(opt));
bind(s,(sockaddr *)&a,sizeof(sockaddr_in));

int nlen=sizeof(addrto);
while(1)
{
strcpy(buf,"Jedi");
int ret=sendto(s,buf,256,0,(sockaddr*)&addrto,nlen);
if(ret==SOCKET_ERROR)
{
}
else
{
if(recvfrom(s,buf,256,0,(struct sockaddr*)&addrto,&nlen)!=SOCKET_ERROR)
{
char *pInfo = buf;
in_addr addr;
memcpy(&addr,pInfo,sizeof(in_addr));
pInfo += sizeof(in_addr);
int nPort = *(int*)pInfo;
char *pIp = inet_ntoa(addr);
MessageBox(pIp);
break;
}
}
}
WSACleanup();----------------------------------------------------------------------------
b机:
SOCKET s;
sockaddr_in from,a;
WSADATA wsdata;
BOOL optval;

WSAStartup(0x0202,&wsdata);
optval=TRUE;

char name[256];
PHOSTENT hostinfo;
int nPort = 1133;
if( gethostname ( name, sizeof(name)) == 0)
{
if((hostinfo = gethostbyname(name)) != NULL)
{
in_addr addr = *(struct in_addr *)*hostinfo->h_addr_list;
memcpy(name,(void*)&addr,sizeof(in_addr));
memcpy(name + sizeof(in_addr),&nPort,sizeof(int));
}
} a.sin_family=AF_INET;
a.sin_addr.s_addr=0;
a.sin_port=htons(5050);

from.sin_family=AF_INET;
from.sin_addr.s_addr=INADDR_BROADCAST;
from.sin_port=htons(5050);

int fromlength=sizeof(SOCKADDR);
s=socket(AF_INET,SOCK_DGRAM,0);
setsockopt(s,SOL_SOCKET,SO_BROADCAST,(char FAR *)&optval,sizeof(optval));
bind(s,(sockaddr *)&a,sizeof(sockaddr_in));
char buf[256];
int i = 0;
while(1)
{
if(recvfrom(s,buf,256,0,(struct sockaddr FAR *)&from,(int FAR *)&fromlength))
{
sendto(s,name,256,0,(struct sockaddr FAR *)&from,fromlength); 
}
Sleep(2000);
i++;
if(i == 2)
break;
}
WSACleanup();哪位能帮我看看是哪里出了问题,在同一台机器上没问题,但是在两台机器上,b能收到广播,但是a收不到b的发送信息。

解决方案 »

  1.   

    sendto(s,name,256,0,(struct sockaddr FAR *)&from,fromlength); 将fromlength改为sizeof(from);试试再有就是if(recvfrom(s,buf,256,0,(struct sockaddr FAR *)&from,(int FAR *)&fromlength))改为if(recvfrom(s,buf,256,0,(struct sockaddr FAR *)&from,(int FAR *)&fromlength)!=SOCKET_ERROR)
      

  2.   

    我遇到过相同的情况,不知道和你的一样不一样。我是有了虚拟机,然后虚拟机里的服务器收到客户机的from里的那个ip地址其实是虚拟机虚拟的网络连接的地址。这样,服务器再发回来自然客户机收不到了。
    我的解决方法是客户机自己取得自己的ip地址和端口,同时绑定这个端口,然后把ip地址和端口发给服务器,服务器根据这个地址和端口把信息发回来。gg/gl
      

  3.   

    如您所言,我确实有虚拟机。但是我在局域网里和另外一个机器通讯也是这样子,但是现象倒是和你说的一样。就是b机得到的ip确实是虚拟机虚拟的那个连接的ip。不知道是怎么回事。
    但是按你说的方法确实是可以解决问题。原因还是不清楚……揭贴吧!