首页
社区
课程
招聘
学习windows socket api编程的一点疑惑?[求助]
发表于: 2005-7-6 21:16 6128

学习windows socket api编程的一点疑惑?[求助]

2005-7-6 21:16
6128
现在正在学习用api编写WinSock程序,遇到了困惑请各位高手们指点一下!
我使用gethostname()和gethostbyname()函数取得本机的IP地址,但如果我连接上了internet之后会出现两个的ip地址.请问高手们有什么办法能把这两个ip地址分开!
我的代码如下:
[CODE]
WORD ver = 0x0002;
WSADATA wsd;

void __fastcall TForm1::FormActivate(TObject *Sender)
{
        char str1[255];
        String str2;
        in_addr mm;
        int flag;

        flag = WSAStartup(ver,&wsd);

        if (flag == 0)
        {
            gethostname(str1,255);
            Form1->Edit1->Text = str1;
            hostent *host = gethostbyname(Form1->Edit1->Text.c_str());
            str2="";
            for (int i=0;host->h_addr_list[i];++i)
            {
                memcpy(&mm,host->h_addr_list[i],sizeof(in_addr));
                str2 = str2 + StrPas(inet_ntoa(mm));
            }
            Form1->Edit2->Text = str2;--->这里会显示两个ip地址!!
            Form1->Edit3->Text = "查询成功!";

            if (WSAIsBlocking()){WSACancelBlockingCall();}

            flag = WSACleanup();
        }else
        {
             Form1->Edit3->Text = "查询失败!";
        }

}

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
晕...晕...点解没人理我哦!!
不过....嘻嘻....我自己找出原因呢?哈哈哈....
不应该使用for循环...因为使用完了gethostbyname()之后会返回一个hosten结构的指针.所以只要把程序改为:
[CODE]
WORD ver = 0x0002;
        WSADATA  wsd;
        char    str1[255];
        char    *str2;
        in_addr mm;
        int flag;
        int i;

        flag = WSAStartup(ver,&wsd);
        if (flag == 0)
        {
             gethostname(str1,255);

             hostent *host = gethostbyname(str1);
             memcpy(&mm,host->h_addr_list[i],sizeof(in_addr));-->i为0就是网卡的ip地址,i为1就是internet的ip地址.

             str2 = inet_ntoa(mm);

             Memo2->Clear();
             Memo2->Text = "本机网络名称:" ;
             Memo2->Lines->Add(str1);

             Memo2->Lines->Add("本机IP地址:");
             Memo2->Lines->Add(str2);

            

             if (WSAIsBlocking()){WSACancelBlockingCall();}
             flag = WSACleanup();
             } else
             {
                 Memo2->Clear();
                 Memo2->Text = "查询失败!";
                 }
2005-7-8 12:27
0
游客
登录 | 注册 方可回帖
返回
//