写了一个UDP广播的程序,一个主机控制几个从机,主机发送广播然后接受从机的相应。过程是:主机发送一个广播后,自身也会收到一个广播,然后从机会给主机一个相应,于是主机接收消息时要加以判断是自身发送的还是来自从机。我的判断思路就是在接收到包的时候判断,receivefrom中带了消息来源的IP地址。
iRecv = recvfrom( recvp->sockSend, recvp->recvBuf, 100, 0, ( LPSOCKADDR)&(addrFrom), &(recvp->fromlen) ); 
addrp = inet_ntoa( addrFrom.sin_addr);  //我这里得到的是 192.168.0.100,是我局域网内的地址
hostAddr = inet_addr( addrp);
然后我获得主机自身地址时用
unsigned long hostAddr;
char hostName[20]="";
PHOSTENT hostinfo;
char hostIp[20];
char *hostIP = hostIp;
int i = gethostname( hostName, 20);
if( i!=0 )
{
   return -6;
}
if( (hostinfo = gethostbyname(hostName)) != NULL )
{
    hostIP = inet_ntoa(*(struct in_addr*) hostinfo ->h_addr_list);//这里的IP居然是172.10.**.**,
}
hostAddr = inet_addr( hostIP);原意是用两个地址做比较的,然后判断数据包的来源,现在是哪个地址取错了?

解决方案 »

  1.   

    我在做TCP的时候遇到这样问题,我做了一个TCP SERVER,当有CLIENT连接时,SERVER要创建一个线程去处理,难道是用LINUX下的FORK()去创建子线程?还是每次CreateThread?
      

  2.   

    估计是你在获取本机ip地址的时候错了。
    我下的一段代码给你贴上:
    void CListCtrl1Dlg::OnButton1() 
        {
            WORD wVersionRequested;
    WSADATA wsaData;
    char name[255];
    CString ip;
    PHOSTENT hostinfo;
    wVersionRequested = MAKEWORD(2, 0);
    if(WSAStartup(wVersionRequested, &wsaData) == 0)
    {
    if(gethostname(name, sizeof(name)) == 0)
    {
    if((hostinfo = gethostbyname(name)) != NULL)
    {
    ip = inet_ntoa(*(struct in_addr *)*hostinfo->h_addr_list);
    }
    }
    WSACleanup();

    AfxMessageBox(name);//name里是本机名
    AfxMessageBox(ip);  //ip中是本机IP
        } 
      

  3.   

    开多线程那个问题呢,TCP里每增加一个连接我就开一个线程?
      

  4.   

    lz的问题,和这个帖子有点类似啊,
    http://topic.csdn.net/u/20091026/17/03a1ba39-8394-4bad-ad89-fc1aa9f12cc9.html
      

  5.   

    hostinfo ->h_addr_list是个数组,
    可以遍历一下这个数组得到内网地址