网络编程小贴士

【C/C++】如何判断是否联网? 编写一个C++程序来判断是否联网是一个相对复杂的任务,因为C++标准库本身并不直接提供网络检测的功能。但是,你可以使用一些第三方库或者系统命令来实现这个功能。下面是一个使用C++结合系统命令(如Linux下的ping或Windows下的ping)的示例,来检查是否能够到达一个特定的网络地址(如Google的公共DNS服务器8.8.8.8)。 阅读详情
网络编程小贴士

( 作者:mikespook | 发布日期:2003-7-4 | 浏览次数:321 )

关键字:网络,IP,主机名
  本文已投稿《黑客安全基地》。文章为《黑客安全基地》所有,未经《黑客安全基地》同意不得转载。谢谢合作!

  下面给大家介绍几个常用的网络编程小贴士。为了方便起见,我将用C++ Builder 5来做演示程序。大家首先应该在C++ Builder 5中做一下配制。
  对于小贴士一至四,你应该在Project Options中的Directories/Conditionals选项卡里添加“$(BCB)/lib/PSDK”到Library path中(图1)。

  并且在头文件(<窗体>.h)中添加“#inclucde “wininet.h””。在<项目>.cpp文件中加入“USELIB(“wininet.lib”);”。
  对于小贴士五、六,只要在头文件(<窗体>.h)加入“#include “winsock2.h””即可。
  在下面的例子中sbMsg是TstatusBar的实例。EdtURL、edtHostName是Tedit的实例。btnTip1、btnTip2、btnTip3、btnTip4、btnTip5、btnTip6是Tbutton的实例。

一、 尝试进行网络连接
  要用的函数:InternetAttemptConnect
  函数原形:DWORD InternetAttemptConnect(DWORD dwREserved);
  这个函数可以说非常简单,只是尝试计算机连接到网络。并不考虑是用什么方式连接。当成功连接到网络的时候,函数返回ERROR_SUCCESS,也就是0。函数的参数永远都是0。有一点需要注意的是,当计算机是用“小猫”也就是拨号的方式上网的时候,在执行InternetAttemptConnect这个函数时,会自动激活拨号连接功能。这也就是很多软件使用的拨号连接功能。比如Foxmail和FlashGet。
  程序如下:
void __fastcall TfrmMain::btnTip1Click(TObject *Sender)
{
        if(ERROR_SUCCESS==InternetAttemptConnect(0))
                sbMsg->SimpleText = "网络连接成功!";
        else
                sbMsg->SimpleText = "网络连接失败!";
}

二、 检查远程主机状态
  要用的函数:InternetCheckConnection
  函数原形:BOOL InternetCheckConnection(LPCSTR lpszUrl, DWORD dwFlags, DWORD dwReserved);
  这个函数的作用和PING命令是一样的,可以检查远程主机是否连接。如果连接成功返回TRUE,如果连接失败返回FALSE。参数lpszUrl是远程主机的IP地址或URL。DwFlags只可设置一个值FLAG_ICC_FORCE_CONNECTION,也就是0x00000001。DwReserved是保留参数,只能设置为0。
  程序如下:
void __fastcall TfrmMain::btnTip2Click(TObject *Sender)
{
        if(InternetCheckConnection(edtURL->Text.c_str(), FLAG_ICC_FORCE_CONNECTION, 0))
                sbMsg->SimpleText = "网络连接成功!";
        else
                sbMsg->SimpleText = "网络连接失败!";
}
三、 检查本地网络连接状态并取得网络连接方式
  要用的函数:InternetGetConnectedState
  函数原形:BOOL InternetGetConnectedState(LPDWORD lpdwFlags,DWORD dwReserved);
  这个函数的功能是很强的。它可以:
  1. 判断网络连接是通过网卡还是通过调治解调器
  2. 是否通过代理上网
  3. 判断连接是On Line还是Off Line
  4. 判断是否安装“拨号网络服务”
  5. 判断调治解调器是否正在使用
  这里我们只需要使用它的第一条功能。参数lpdwFlags返回当前网络状态。这里我们只要用下面两个标志进行判断。
  INTERNET_CONNECTION_MODEM 通过调治解调器连接网络
  INTERNET_CONNECTION_LAN 通过局域网连接网络
  参数dwReserved依然是保留参数,设置为0即可。
  当函数返回TRUE时说明连接到网络,否则返回FALSE。
  程序如下:
void __fastcall TfrmMain::btnTip3Click(TObject *Sender)
{
        DWORD dwFlag;
        if(!InternetGetConnectedState(&dwFlag, 0))
                sbMsg->SimpleText = "网络未连接。";
        else
        if(dwFlag & INTERNET_CONNECTION_MODEM)
                sbMsg->SimpleText = "采用调治解调器上网。";
        else
        if(dwFlag & INTERNET_CONNECTION_LAN)
                sbMsg->SimpleText = "采用网卡上网。";
}
四、 判断是否使用代理连接
  依然使用上面的这个InternetGetConnectedState函数。当lpdwFlags的标志判断为INTERNET_CONNECTION_PROXY的时候,说明本地使用代理连接到网络。
  程序如下:
void __fastcall TfrmMain::btnTip4Click(TObject *Sender)
{
        DWORD dwFlag;
        if(!InternetGetConnectedState(&dwFlag, 0))
                sbMsg->SimpleText = "网络未连接。";
        else
        if(dwFlag & INTERNET_CONNECTION_PROXY)
                sbMsg->SimpleText = "使用代理连接。";
        else
                sbMsg->SimpleText = "未使用代理连接。";
}
五、 取得本机IP地址
  要用的函数:gethostname、gethostbyname、inet_ntoa
  函数原形: int gethostname(char FAR *name,int namelen);
  struct hostent FAR *gethostbyname(const char FAR *name);
  char FAR * inet_ntoa(struct in_addr in);
  函数gethostname可以取得本地计算机主机名。参数name就是调用函数后保存主机名的字符指针。参数namelen是name参数的长度。
函数gethostbyname可以利用参数name传入的主机名返回一个hostent结构。这个结构的原形如下:
struct hostent {
  char FAR *       h_name;
  char FAR * FAR * h_aliases;
  short            h_addrtype;
  short            h_length;
  char FAR * FAR * h_addr_list;
};
  其中h_name返回主机名;h_aliases返回主机别名;h_addrtype返回IP地址的类型;h_length返回IP地址长度;h_addr_list返回IP地址。这里特别要说明一下的是h_addr_list。因为一台计算机可能有多个有效的IP地址,所以h_addr_list实际上是一个数组。并且h_addr_list返回的是以网络位顺序表示的IP地址,还需要通过inet_ntoa函数转化为以“.”做分隔的IP地址。
  函数inet_ntoa转化网络位顺序表示的IP地址到“xxx.xxx.xxx.xxx”这种形式的IP地址。参数in是一个in_addr结构。我们只要知道怎么使用inet_ntoa函数即可,如果想了解更多的内容可以去查MSDN。
  程序如下:
void __fastcall TfrmMain::btnTip5Click(TObject *Sender)
{
        char cHostName[256];
        AnsiString strAdd;
        gethostname(cHostName, sizeof(cHostName));
        hostent *Host = gethostbyname(cHostName);
        if(NULL==Host)
                sbMsg->SimpleText = "获取IP地址错误。";
        else
        {
                in_addr addr;
                for(int i = 0; Host->h_addr_list[i] != 0; ++i) //注意这里的循环
                {
                        memcpy(&addr, Host->h_addr_list[i], sizeof(in_addr));
                        strAdd = strAdd + " " + StrPas(inet_ntoa(addr));
                }
                sbMsg->SimpleText = "本机IP地址为"+strAdd;
        }
}
  这里要特别说明一下的就是那个循环。前面说过了,因为一台计算机可能有多个有效的IP地址,所以h_addr_list实际上是一个数组。所以我们要利用这么一个循环取得本地主机所有可能的IP。
六、 远程主机名到IP地址的转化
  有了前面的讲解,要进行远程主机名到IP地址的转化可以说是易如反掌。只要对程序进行下面的修改即可。
  程序如下:
void __fastcall TfrmMain::btnTip6Click(TObject *Sender)
{
        char cHostName[256];
        AnsiString strAdd;
/*
        注意这里和小贴士五中的区别
gethostname(cHostName, sizeof(cHostName));
hostent *Host = gethostbyname(cHostName);
*/
        hostent *Host = gethostbyname(edtHostName->Text.c_str());
        if(NULL==Host)
                sbMsg->SimpleText = "获取IP地址错误。";
        else
        {
                in_addr addr;
                for(int i = 0; Host->h_addr_list[i] != 0; ++i)
                {
                        memcpy(&addr, Host->h_addr_list[i], sizeof(in_addr));
                        strAdd = strAdd + " " + StrPas(inet_ntoa(addr));
                }
                sbMsg->SimpleText ="计算机" + edtHostName->Text + "的IP地址为"+strAdd;
        }
}
  这里补充说明以下,当cHostName为NULL的时候,函数取得的依然是本地主机的IP地址。

  这六个小贴士是网络编程中最常用的,也是最好用的小技巧。用好,用精的话,你可以写出许许多多好用的小工具出来。
解决2K/4K高分屏下Vmware等虚拟机下Kail Linux界面显示问题 为了使这个过程更容易,Kali 现在提供了 HiDPI 模式。在我们日常使用VirtualBox、Vmware workstation、Hyper-V等虚拟机安装使用Kali系统,在2K/4K高分辨率电脑下Kali系统界面显示太小,包括各种软件及命令终端字体均无法很直观的看出,影响我们的正常测试及使用。很多人会通过调整我们笔记本或台式机的系统屏幕分辨率设置,或者修改缩放显示比例等,还有尝试通过修改kali显示设置发现调整前后都没有任何变化,更有甚者会将虚拟化软件降级到老版本或者使用老版本Kali等等。 阅读详情

相关推荐

关于Qt4K高分屏自适应问题

从Qt5.14开始提供了高分屏缩放策略设置,需要在main函数前面设置 QApplication::setHighDpiScaleFactorRoundingPolicy(Qt::HighDpiScaleFactorRoundingPolicy::PassThrough);如果不想要高分屏,希望程序永远保持默认的尺寸,你需要在main函数前面设置 QApplication::setAttribute(Qt::AA_Use96Dpi);在main函数最前面设置QT的环境变量。新版本的Qt支持不是整数的缩放。

L_Andy的专栏 2626

C++ 网络连通性检测的实现方法

主要介绍了C++ 网络连通性检测的实现方法的相关资料,这里提供实例帮助大家实现这样的功能,需要的朋友可以参考下

Arch Linux高分屏不识别问题排查全攻略

当外接显示器在Linux下无法识别高分辨率时,很多用户优先怀疑硬件,但根本原因往往在于从内核到桌面环境的链路协商。显示器的EDID数据通过DDC通道传递给显卡驱动,再由KMS/DRM生成模式列表,最终由Xorg或Wayland合成器决定输出。任何一环配置缺失都会导致系统回落到安全模式。Arch Linux默认提供最保守的配置,因此更容易暴露问题。本文从驱动加载、显示服务器模式协商、桌面环境缩放三层展开,结合Intel i915、AMD amdgpu、NVIDIA modeset等具体案例,介绍使用journ

weixin_33507732的博客 108

C++判断主机是否处于联网状态

本文实例为大家分享了C++判断主机是否处于联网状态的具体代码,供大家参考,具体内容如下 直接让本机访问一个网站,如果成功的话,就说明成功联网,没有访问成功,则说明没有联网!!! #include<iostream> #include <WINSOCK2> #pragma comment(lib,ws2_32.lib) #define LEN 1024 //接收数据的大小 using namespace std; int main() { //加载套接字库 WORD wVersionRequested; WSADATA wsaData; int err; wVersionR

WPS字体发虚?3种方法快速修复高分辨率屏幕下的显示问题(附QT_SCREEN_SCALE_FACTORS详解)

本文针对Linux高分辨率屏幕下WPS字体发虚问题,提供了三级修复方案。核心是通过设置QT_SCREEN_SCALE_FACTORS环境变量,解决QT框架与系统缩放冲突。文章详细介绍了从临时终端启动、修改桌面入口文件到配置系统环境变量的具体步骤,并提供了进阶排查思路,帮助用户获得清晰显示体验。

happy2的博客 958

Linux下WPS字体优化全攻略:从安装到高分辨率适配(含ttf-wps-fonts配置)

本文详细介绍了在Linux系统下优化WPS字体显示的全套方案,包括基础字体安装、高分辨率屏幕适配(重点讲解QT_SCREEN_SCALE_FACTORS环境变量配置)、字体微调技巧及常见问题排查。通过系统级的字体配置和QT框架优化,有效解决WPS在Linux下的字体模糊、发虚等问题,特别适合4K等高分辨率显示器用户提升办公体验。

pea55的博客 1128

C++ 判断网络是否连通

使用InternetGetConnectedState这个API判断网络是否连通 详细说明: 虽然MSDN中定义了7种参数类型,但实际中wininet.h头文件中只对四种类型的值进行了定义 7种类型: INTERNET_CONNECTION_LAN       局域网 INTERNET_CONNECTION_MODEM     拨号上网 INTERNET_CONNECTION_PROXY      代理 INTERNET_CONNECTION_MODEM_BUSY  代理被占用 INTER...

my_angle2016的博客 2983

UE5像素流送WebRTC双向通信:从原理到实战部署

WebRTC作为实现浏览器端实时音视频通信的基石技术,其核心在于通过P2P连接实现低延迟、高可靠的数据传输。该技术不仅支持音视频流,其内置的数据通道(Data Channel)功能,为双向、实时的自定义数据交换提供了可能,具有极高的技术价值。在工程实践中,这为构建复杂的交互式应用,如云端渲染、远程控制、实时协作等场景,奠定了坚实的基础。本文聚焦于将WebRTC数据通道与虚幻引擎5(UE5)的像素流送技术深度结合,解决Web端与UE5应用间自定义指令传递、状态同步等核心通信问题,例如通过JSON-RPC实现健

weixin_34054931的博客 3204

C\C++ 使用ping判断ip是否能连通

ping是一种用于测试网络连接的工具,它通过发送数据包到目标设备并等待其响应来工作,以检查网络是否连通。下面是例子.

王牌飞行员_里海的博客 3865

Qt4K高分屏自适应,解决字体没有跟随组件增大的问题

解决背景 在一次做项目的过程中,公司让我做高分屏适配,就是让我们所开发的软件支持4K屏的显示,我在百度上开始搜索资料,有很多博客给出的答案就是: #if(QT_VERSION >= QT_VERSION_CHECK(5,6,0)) QApplication::setAttribute(Qt::AA_EnableHighDpiScaling); #endif QApplication a(argc, argv);    解决过程 我也这样做了,结果,没

weixin_41191739的博客 1342

UE5.3像素流送上云:Docker+Linux服务器部署完整指南

云渲染是当前实时3D应用上云的重要方向,其核心在于将UE等引擎的渲染能力通过WebRTC流媒体协议推送到浏览器终端。理解渲染进程、信令服务器与浏览器播放器的协作原理,是搭建稳定云渲染链路的基础。容器化部署借助Docker实现环境一致性,大幅降低UE像素流送在Linux服务器上的复现与运维成本。结合NVIDIA GPU云服务器,通过nvidia-container-toolkit将GPU能力注入容器,配合虚拟显示与虚拟音频配置,即可实现无头渲染。实际落地中需重点关注WebRTC网络端口规划、信令地址配置、TU

weixin_32612263的博客 223

Linux高分屏光标优化:xcursor-medium5主题的实用指南

在Linux桌面环境中,鼠标光标是用户与系统交互的核心视觉元素之一,其设计直接影响操作效率和视觉体验。光标主题通过一套图标集合定义指针在不同状态下的外观,其原理基于X11或Wayland显示服务器协议,由libXcursor等库负责加载与渲染。一个优秀的光标主题能显著提升高分辨率屏幕下的可视性,减少视觉疲劳,其技术价值在于平衡美学与功能性,确保在不同背景和DPI下的清晰识别。常见的应用场景包括软件开发、图形设计等需要长时间专注屏幕的工作环境。本文聚焦于xcursor-medium5这一开源主题,它针对高分屏

weixin_33720078的博客 342

时间子系统7_高分辨率定时器处理

// 高分辨率下的定时器软中断 // 当增加一个hrtimer到rbtree中后,会raise高分辨率定时器软中断 // 函数任务: // 1.关中断下,运行所有hrtimer // 注: // 在hrtimers_init中,open_softirq(HRTIMER_SOFTIRQ, run_hrtimer_softirq); 1.1 static void run_hrtimer_s

奔跑的Linerdx的专栏 1866

JMeter 5.6.3高分屏字体过小?三招搞定Java Swing DPI缩放适配

Java Swing作为经典的桌面应用GUI框架,在高分辨率显示器普及的今天,面临着DPI缩放适配的挑战。其原理在于Java运行时环境(JRE/JDK)对系统DPI设置的感知与渲染机制。解决此问题对于保障开发效率和工具可用性具有直接的工程实践价值,尤其在需要精细操作的性能测试、配置管理等场景。通过调整JVM启动参数、升级JDK版本或修改应用外观配置,可以有效优化Swing应用在高分屏上的显示效果。本文聚焦于性能测试工具Apache JMeter,针对其5.6.3版本在高分屏上出现的字体过小问题,提供了从修改

weixin_33698043的博客 401

Manjaro Linux安装QQ和微信

系统版本 系统版本:manjaro 21.0.1 桌面环境:KDE Plasma 5.21.4 Linux系统安装以后使用QQ和微信是个问题,QQ虽然出了原生的 linux 版本,但是。。。呵呵 所以我使用 wine 版本的 TIM 和微信 首先安装 yay 工具 sudo pacman -S yay 安装 TIM 和微信 然后安装TIM yay -S com.qq.tim.spark 安装微信 yay -S com.qq.weixin.spark 安装完成以后就可以直接启动了 字体问题 启动后可能会

龙狐的博客 9299

优化WPS在高分辨率屏幕下的字体显示:QT_SCREEN_SCALE_FACTORS的实战应用

本文针对WPS Office在Linux高分辨率屏幕下字体发虚、模糊的问题,提供了详细的解决方案。文章深入剖析了问题根源在于Qt框架的缩放机制,并重点介绍了通过设置QT_SCREEN_SCALE_FACTORS环境变量来强制修正渲染的核心方法。文中提供了四种实战设置方案,从临时验证到永久修复,并延伸至其他Qt应用,帮助用户彻底解决高分屏下的字体显示难题。

python9snake的博客 481

深度定制Arctica Greeter:从字体、背景到高分辨率适配的完整实践

本文详细介绍了如何深度定制Arctica Greeter,包括字体、背景和高分辨率适配的完整实践。通过调整GSchema配置、优化背景图片显示和正确配置分辨率切换逻辑,解决高分辨率显示器下的视觉困境,提升Linux登录界面的用户体验。

weixin_30740581的博客 418

VisDrone2019数据集实战:从下载到YOLO格式转换的完整指南

本文提供了一份完整的VisDrone2019数据集实战指南,详细介绍了从数据集下载、理解其独特的标注格式,到转换为YOLO模型可直接训练格式的全过程。通过清晰的代码示例和步骤讲解,帮助读者掌握处理复杂无人机视觉数据集的核心技能,为基于YOLO的目标检测模型训练做好准备。

weixin_29165725的博客 385
上一篇: 任务管理器全接触
下一篇: 使用VC#制作多线程TCP connect扫描器
mikespook
博客等级 码龄25年 72粉丝 34原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值