热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

如何在网络编程中准确获取本地主机的IP地址

在进行网络编程时,准确获取本地主机的IP地址是一项基本但重要的任务。Winsock作为20世纪90年代初由Microsoft与多家公司共同制定的Windows平台网络编程接口,为开发者提供了一套高效且易用的工具。通过Winsock,开发者可以轻松实现网络通信功能,并准确获取本地主机的IP地址,从而确保应用程序在网络环境中的稳定运行。此外,了解Winsock的工作原理及其API函数的使用方法,有助于提高开发效率和代码质量。
Winsock是90年代初,为了方便网络编程,由Microsoft联合了其他几家公司共同制定的一套WINDOWS下的网络编程接口,它是通过C语言的动态链接库方式提供给用户及软件开发者的,主要由winsock.h头文件和动态链接库winsock.dll组成,目前有两个版本:Winsock1.1和Winsock2.0。

在Win32平台上,访问众多的基层网络协议,Winsock是首选接口。

  用Visual C++6.0编译Windows C程序,使用Winsock API函数时,首先要把wsock32.lib添加到它的库模块中,否刚在链接的时候,会出现“error LNK2001”错误。添加wsock32.lib的具体步骤是:打开工程菜单,选择设置,在弹出的Project settings对话框中,点击link选项卡,然后在对象/库模块文本框中添加wsock32.lib。

  最简单的网络编程是获取本机的主机名和IP地址,这个程序使用了WSAStart()、WSAClenaup()、gethostname()、gethostbyname()四个winsock API函数,这四个函数的功能和使用方法介绍如下:



1. WSAStartup():

  【函数原型】

int PASCAL FAR WSAStartup(WORD wVersionRequired, LPWSADATA lpWSAData);
       【使用说明】

  每一个使用winsock的应用程序,都必须进行WSAStart函数调用,并且只有在调用成功之后才能使用其它的winsock网络操作函数。

  WVersionRequired&#xff1a;<输入>表示欲使用的&#xff37;insock版本&#xff0c;这是一个WORD类型的整数&#xff0c;它的高位字节定义的是次版本号&#xff0c;低位字节定义的是主版本号。

  LpWSAData&#xff1a;<输出>是一个指向WSADATA资料的指针。这个资料我们一般不使用。

  返回值&#xff1a;调用成功返回0&#xff1b;否则&#xff0c;返回出错信息。

2&#xff0e; WSAClenaup():

     【函数原型】

int PASCAL FAR WSACleanup(void);
       【使用说明】

  winsock使用后&#xff0c;要调用&#xff37;SACleanup函数关闭网络设备&#xff0c;以便释放其占用的资源。

3&#xff0e;gethostname()

  【函数原型】

int PASCAL FAR gethostname (char FAR * name, int namelen);
       【使用说明】

  该函数可以获取本地主机的主机名&#xff0c;其中&#xff1a;

  name&#xff1a;<输出>用于指向所获取的主机名的缓冲区的指针。

  Namelen&#xff1a;<输入>缓冲区的大小&#xff0c;以字节为单位。

  返回值&#xff1a;若无错误&#xff0c;返回0&#xff1b;否则&#xff0c;返回错误代吗。

4&#xff0e;gethostbyname()

    【函数原型】

strUCt hostent FAR * PASCAL FAR gethostbyname(const char FAR * name);
      【使用说明】

  该函数可以从主机名数据库中得到对应的“主机”。

  该函数唯一的参数name就是前面调用函数gethostname()得到的主机名。若无错误&#xff0c;刚返回一个指向hostent结构的批针&#xff0c;它可以标识一个“主机”列表。

Hostent结构定义如下&#xff1a;

Struct hostent
{
char FAR * h_name;
char FAR FAR ** h_aliases;
short h_addrtype;
char FAR FAR ** h_addr_list;
}
        其中&#xff1a;

h_name&#xff1a;<输入>主机名地址&#xff08;PC&#xff09;。
h_aliases&#xff1a;一个由主机备用名组成的空中止数组。
H_addrtype&#xff1a;返回地址的类型&#xff0c;对于Winsock,这个域总是PF_INET。
H_lenth&#xff1a;每个地址的长度&#xff08;字节数&#xff09;&#xff0c;对应于PF_INET域应该为4。
H_addr_list&#xff1a;应该以空指针结尾的主机地址的列表&#xff0c;返回的地址是以网络顺序排列的。

  其中&#xff0c;h_addr_list[0]存放的就是本地主机的4个字节的IP地址&#xff0c;即&#xff1a;

  h_addr_list[0][0].h_addr_list[0][1].h_addr_list[0][2].h_addr_list[0][3]


  一个简单的用消息框显示主机名和IP地址的源程序如下&#xff1a;

#include

#pragma comment(lib,"wsock32.lib")

int WSA_return;
WSADATA WSAData;

HOSTENT *host_entry;
char host_name[256];
char host_address[256];

int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,
      LPSTR lpCmdLine,int nCmdShow)
{
 WSA_return&#61;WSAStartup(0x0101,&WSAData);

  if(WSA_return&#61;&#61;0)
  {
   gethostname(host_name,256);
   host_entry&#61;gethostbyname(host_name);
   if(host_entry!&#61;0)
   {
    wsprintf(host_address,"%d.%d.%d.%d",
     (host_entry->h_addr_list[0][0]&0x00ff),
     (host_entry->h_addr_list[0][1]&0x00ff),
     (host_entry->h_addr_list[0][2]&0x00ff),
     (host_entry->h_addr_list[0][3]&0x00ff));

       MessageBox(NULL,host_address,host_name,MB_OK);

     }
  }
  WSACleanup();
  return 0;
}


效果如下图。



&#xfeff;&#xfeff;

推荐阅读
  • 本文详细介绍了在 Windows 7 系统中配置 Nginx 1.10.3 和 PHP 7.1.1 NTS 的步骤,包括修改 PHP 配置文件、处理依赖项以及创建批处理脚本启动和停止服务。重点解释了如何解决常见的运行时错误。 ... [详细]
  • 创建项目:Visual Studio Online 入门指南
    本文介绍如何使用微软的 Visual Studio Online(VSO)创建和管理开发项目。作为一款基于云计算的开发平台,VSO 提供了丰富的工具和服务,简化了项目的配置和部署流程。 ... [详细]
  • 本文详细介绍了如何使用 Yii2 的 GridView 组件在列表页面实现数据的直接编辑功能。通过具体的代码示例和步骤,帮助开发者快速掌握这一实用技巧。 ... [详细]
  • Windows 系统下 MySQL 8.0.11 的安装与配置
    本文详细介绍了在 Windows 操作系统中安装和配置 MySQL 8.0.11 的步骤,包括环境准备、安装过程以及后续配置,帮助用户顺利完成数据库的部署。 ... [详细]
  • 在当前众多持久层框架中,MyBatis(前身为iBatis)凭借其轻量级、易用性和对SQL的直接支持,成为许多开发者的首选。本文将详细探讨MyBatis的核心概念、设计理念及其优势。 ... [详细]
  • 如何在窗口右下角添加调整大小的手柄
    本文探讨了如何在传统MFC/Win32 API编程中实现类似C# WinForms中的SizeGrip功能,即在窗口的右下角显示一个用于调整窗口大小的手柄。我们将介绍具体的实现方法和相关API。 ... [详细]
  • 本文探讨了如何优化和正确配置Kafka Streams应用程序以确保准确的状态存储查询。通过调整配置参数和代码逻辑,可以有效解决数据不一致的问题。 ... [详细]
  • 2023年京东Android面试真题解析与经验分享
    本文由一位拥有6年Android开发经验的工程师撰写,详细解析了京东面试中常见的技术问题。涵盖引用传递、Handler机制、ListView优化、多线程控制及ANR处理等核心知识点。 ... [详细]
  • 使用Python在SAE上开发新浪微博应用的初步探索
    最近重新审视了新浪云平台(SAE)提供的服务,发现其已支持Python开发。本文将详细介绍如何利用Django框架构建一个简单的新浪微博应用,并分享开发过程中的关键步骤。 ... [详细]
  • 本文详细探讨了VxWorks操作系统中双向链表和环形缓冲区的实现原理及使用方法,通过具体示例代码加深理解。 ... [详细]
  • VPX611是北京青翼科技推出的一款采用6U VPX架构的高性能数据存储板。该板卡搭载两片Xilinx Kintex-7系列FPGA作为主控单元,内置RAID控制器,支持多达8个mSATA盘,最大存储容量可达8TB,持续写入带宽高达3.2GB/s。 ... [详细]
  • Linux设备驱动程序:异步时间操作与调度机制
    本文介绍了Linux内核中的几种异步延迟操作方法,包括内核定时器、tasklet机制和工作队列。这些机制允许在未来的某个时间点执行任务,而无需阻塞当前线程,从而提高系统的响应性和效率。 ... [详细]
  • 本文详细介绍了 Visual FoxPro 中 GETCOLOR() 函数的功能及其使用方法,帮助开发者更好地理解和应用该函数。 ... [详细]
  • TortoiseSVN与VisualSVN Server的安装及基本操作指南
    本文详细介绍了如何安装VisualSVN Server以及TortoiseSVN客户端,并提供了基本的操作步骤,包括配置仓库、用户管理及权限设置等关键环节。 ... [详细]
  • 俗话说得好,“工欲善其事,必先利其器”。这句话不仅强调了工具的重要性,也提醒我们在任何项目开始前,准备合适的工具至关重要。本文将介绍几款C语言编程中常用的工具,帮助初学者更好地选择适合自己学习和工作的编程环境。 ... [详细]
author-avatar
小池子的思密达
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有