免费注册 查看新帖 |

Chinaunix

广告
  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1690 | 回复: 4
打印 上一主题 下一主题

关于广播程序的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-08-22 17:20 |只看该作者 |倒序浏览
当服务器送出广播信息后客户端可以正常的接收到该信息,但是客户端接受地址中的IP地址和端口号都时始终是零,这是为什么?服务器代码如下。


int ESMAIOService::StartService()
{
        int  so_broadcast = 1;
    struct timeval revtimeout;
         
        sockfd = socket(AF_INET, SOCK_DGRAM, 0);
          
        if (sockfd == -1)
        {
                cerr<< "Error: socket( )"<< endl;
                return -1;
        }

        memset(&bc_addr, 0, sizeof(bc_addr));
        bc_addr.sin_family = AF_INET;
        bc_addr.sin_port = htons(m_SearchPort);
        bc_addr.sin_addr.s_addr        = inet_addr(m_Addr);

        // set socket option - enable broadcasting
        if (setsockopt(sockfd, SOL_SOCKET,SO_BROADCAST, &so_broadcast,sizeof(so_broadcast)))
        {
                cerr << "error : setsockopt(..SO_BROADCAST..)" << endl;
                return -1;
        }
       
        revtimeout.tv_sec        = 3;
        setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, &revtimeout, sizeof(revtimeout));
       
        cout<<"Broadcast port "<<m_SearchPort<<endl;
       
        pthread_create(&SearchThread,NULL,SearchLogin,(void*)this);
        return 1;
}

        ESMAIOService * cs = static_cast<ESMAIOService*>;(a_para);
        char test[] = "welcome in cs---------------\n";
        struct sockaddr_in from;
        int len=0;
        int searchTimes = 10;;
        struct in_addr ServAddr;
        char           pServerAddr[20];
        CONTROL_CMD_HEAD head;
        SEARCH_SERVER_REQUEST request;
    SEARCH_SERVER_RESPOND respond;
           
        request.data.CmdHead  = htons(CMD_SEARCH_SERVER_REQUEST);
        request.data.State    = 0;
        request.data.User_ID  = 0;
        request.data.Check    = 0;
       
        for( int i=0; i<searchTimes; i++)
        {
                if (sendto(cs->;sockfd,&test,sizeof(test),0,(struct sockaddr*)&cs->;bc_addr,sizeof(struct sockaddr_in))==-1)
                //if (sendto(cs->;sockfd,&request,sizeof(request),0,(struct sockaddr*)&cs->;bc_addr,sizeof(struct sockaddr_in))==-1)
                {
                        cout<<"Broadcast error!"<<endl;
                        return NULL;
                }
                cout<<"begin recve head"<<endl;
                memset(&from, 0, sizeof(from));
                from.sin_family = AF_INET;
                from.sin_port = htons(cs->;m_SearchPort);
                from.sin_addr.s_addr = htonl(INADDR_ANY);
                if (recvfrom(cs->;sockfd,(void*)&(head),sizeof(head),0,(struct sockaddr*)&from,(socklen_t*)&len)==-1)
                {
                        cout<<"recv head error!"<<endl;
                        sleep(60);
                        continue;
                }
                cout<<"end recve head"<<endl;
                if (head.CmdHead == ntohs(CMD_SEARCH_SERVER_RESPOND))
                {
                    if (recvfrom(cs->;sockfd,(void*)&(respond.ServerAddr),sizeof(respond.ServerAddr),0,(struct sockaddr*)&from,(socklen_t*)&len)==-1)
                        {
                                cout<<"recv server addr error!"<<endl;
                                continue;
                        }        
                        memset(&ServAddr,0,sizeof(ServAddr));
                        ServAddr.s_addr = respond.ServerAddr;
                        strcpy((char*)pServerAddr,inet_ntoa(ServAddr));
                       
                        if (recvfrom(cs->;sockfd,(void*)&(respond.ServerPort),sizeof(respond.ServerPort),0,(struct sockaddr*)&from,(socklen_t*)&len)==-1)
                        {
                                cout<<"recv server port error!"<<endl;
                                continue;
                        }        
                        respond.ServerPort = ntohs(respond.ServerPort);
                        cout<<"IP:"<<pServerAddr<<"      Port:"<<respond.ServerPort<<endl;
                        if (recvfrom(cs->;sockfd,(void*)&(respond.WorkModel),sizeof(respond.WorkModel),0,(struct sockaddr*)&from,(socklen_t*)&len)==-1)
                        {
                                cout<<"recv WorkModel error!"<<endl;
                                continue;
                        }        
                        respond.WorkModel = ntohs(respond.WorkModel);
                        if (respond.WorkModel == SERVER_OPEN_MODEL)     //开放模式
                        {
                        }
                        else if (respond.WorkModel == SERVER_CLOSE_MODEL) //关闭模式
                        {
                        }
                       
                } //if (head.CmdHead == ntohs(CMD_SEARCH_SERVER_RESPOND))
                else
                {
                        sleep(60);
                        continue;
                };       
                       
        } //for( int i=0; i<searchTime; i++)
        cout<<"-------------Can't search login server!--------------"<<endl;
}


客户端代码:
void * ESMALoginService::ClientNotify(void * a_Para)
{
        ESMALoginService * cs = static_cast<ESMALoginService*>;(a_Para);
        struct hostent *h;
        char host[100];
       
        gethostname(host, 100);
        if ((h = gethostbyname(host)) == NULL)
        {
                printf("Error : %s!\n", hstrerror(h_errno));
                return NULL;
        };
               
        //char * addr = "192.168.0.239";//inet_ntoa (*((struct in_addr *)h->;h_addr_list[0]));//
        long   addr = ((struct in_addr *)h->;h_addr_list[0])->;s_addr;
        while(1)
        {
                struct sockaddr_in from;
                int len=0;
                unsigned short WorkModel;
                CONTROL_CMD_HEAD head;
                SEARCH_SERVER_RESPOND respond;
                if (recvfrom(cs->;sockfd,(void*)&head,sizeof(head),0,(struct sockaddr*)&from,(socklen_t*)&len) == -1)
                {
                        cout<<"recv head error!"<<endl;
                        continue;
                }
                cout<<"Recvie IP:"<<inet_ntoa(from.sin_addr)<<"  Recive Port:"<<ntohs(from.sin_port)<<endl;
                if (ntohs(head.CmdHead) == CMD_SEARCH_SERVER_REQUEST)
                {
                       
                        cout<<"IP:"<<inet_ntoa (*((struct in_addr *)h->;h_addr_list[0]))<<"      Port:"<<cs->;m_ListenPort<<endl;
                        respond.Head.CmdHead = htons(CMD_SEARCH_SERVER_RESPOND);
                        respond.Head.State    = htons(0);
                        respond.Head.User_ID  = htons(0);
                        respond.Head.Check    = htonl(ntohl(head.Check) + 1);
                        respond.ServerAddr    = htonl(addr);//htonl(inet_addr(addr));
                        respond.ServerPort    = htons(cs->;m_ListenPort);
                                               
                        WorkModel = cs->;GetServerWorkModel();
                        if (WorkModel == -1)
                        {
                                cout<<"GetServerWorkModel  error!"<<endl;
                                continue;
                        }                       
                        respond.WorkModel = htons(WorkModel);
                       
                        /*struct sockaddr_in serv_addr;
                        memset(&serv_addr, 0, sizeof(serv_addr));
                        serv_addr.sin_family = AF_INET;
                        serv_addr.sin_port = htons(cs->;m_ListenPort);
                        serv_addr.sin_addr.s_addr        =  inet_addr("192.168.0.239";*/
                if (sendto(cs->;sockfd,(void*)&respond,sizeof(respond),0,(struct sockaddr*)&from,len) == -1)
                        {
                                cout<<"send SEARCH_SERVER_RESPOND error!"<<endl;
                            continue;
                        }
                       
                }  // if (ntohs(head.ComdHead) == CMD_SEARCH_SERVER_REQUEST)
               
        } // while
       
}

int main()
        sockfd = socket(AF_INET, SOCK_DGRAM, 0);
        if (sockfd == -1)
        {
                cerr<< "Error: socket( )"<< endl;
                return -1;
        }
        // set up server address
        struct sockaddr_in serv_addr;
        memset(&serv_addr, 0, sizeof(serv_addr));
        serv_addr.sin_family = AF_INET;
        serv_addr.sin_port = htons(m_ListenPort);
        serv_addr.sin_addr.s_addr        = htonl(INADDR_ANY);
       
        if (bind(sockfd, (struct sockaddr *)&serv_addr,sizeof(serv_addr)))
        {
                cerr << "error : bind" << endl;
                return -1;
        }
       
        cout<<"listen udp port:"<<m_ListenPort<<endl;
       
        pthread_create(&ClientThread,NULL,ClientNotify,(void*)this);
        return 1;
}

客户端输出如下:
Recvie IP:0.0.0.0  Recive Port:0
IP:127.0.0.1      Port:5001
send SEARCH_SERVER_RESPOND error!

论坛徽章:
0
2 [报告]
发表于 2005-08-22 17:38 |只看该作者

关于广播程序的问题

楼主,你自己先找了原因么?
看你这样子发问似乎你没先努力去自己找答案哦
虽然很多时候别人愿意帮你
但是如果别人找答案的的时间比你多的话,我想未必他就开心
懒人通常是不会受尊重的

论坛徽章:
0
3 [报告]
发表于 2005-08-22 18:37 |只看该作者

关于广播程序的问题

原帖由 "luojiannx" 发表:
楼主,你自己先找了原因么?
看你这样子发问似乎你没先努力去自己找答案哦
虽然很多时候别人愿意帮你
但是如果别人找答案的的时间比你多的话,我想未必他就开心
懒人通常是不会受尊重的


首先感谢你的回复,不瞒你说,我已经花了一下午的时间了,但还是没发现问题,同时我还发现我周五的程序中tcp的服务器启动后接受客户端的连接后也没法正确取得客户端的ip地址和端口号,这个程序在周五运行时没问题的,我怀疑是否是我的机器配置出问题了。

论坛徽章:
0
4 [报告]
发表于 2005-08-22 18:43 |只看该作者

关于广播程序的问题

说句老实话
每个稍微复杂点的问题只要是我学过的我都想尝试帮助一下
但是看到你这样的帖子就不能不让我怀疑你的诚意了
首先,应该尽量的简化程序,自己先测试,确定出问题的地方是在什么部分
一般通过简化的步骤就可以自己发现问题的所在了
如果精简到不能再精简了,还没发现问题所在就发问吧
另外发帖子的时候起码的要把代码用code标签围起来,要不别人还要费力去整理
因为不那样很容易丢失一些字符,会出现笑脸一样的小图形

论坛徽章:
0
5 [报告]
发表于 2005-08-23 11:14 |只看该作者

关于广播程序的问题

原帖由 "luojiannx" 发表:
说句老实话
每个稍微复杂点的问题只要是我学过的我都想尝试帮助一下
但是看到你这样的帖子就不能不让我怀疑你的诚意了
首先,应该尽量的简化程序,自己先测试,确定出问题的地方是在什么部分
一般通过简化的步骤..........


首先对于你的多次帮助我非常感谢你。我也想过要精简程序的,但我又担心没有上下文可能不太好理解。所以就把我写的函数都贴出来了;以下是主要的代码:

服务器端开始广播
if (sendto(sockfd,&test,sizeof(test),0,(struct sockaddr*)&csbc_addr,sizeof(struct sockaddr_in))==-1)
{
        cout<<"Broadcast error!"<<endl;
        return NULL;
}

客户端可以正确收到广播信息,但是收到后输出的IP地址是:0.0.0.0 端口号是 0;
if (recvfromsockfd,(void*)&head,sizeof(head),0,(struct sockaddr*)&from,(socklen_t*)&len) == -1)
{
        cout<<"recv head error!"<<endl;
        continue;
}
cout<<"Recvie IP:"<<inet_ntoa(from.sin_addr)<<"  Recive Port:"<<ntohs(from.sin_port)<<endl;
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP