作者:小 琛
欢迎转载,请标明出处

引言:之前关于网络编程的博文都是基于Linux环境下,而因为后续工作的原因,开发环境为Windows故而学习该内容。实际学习中发现,整个编程思路和流程并没有很大差别,仅仅在于些许语法和库文件上。

文章目录

  • socket、Windows下的socket
  • Windows下构建WinSock应用程序框架
    • 头文件与库
    • 结构体WSADATA
    • 初始化函数WSAStartsup()、清除函数WSACleanup()
  • 网络编程的常用辅助函数
  • 例子:通过一个控制应用程序实现初始化一个Windows Sockets 并打印具体信息

socket、Windows下的socket

什么是socket?

socket这个词,字面意思为:凹槽、插座、插孔,这些设备在生活中给我带来了很多方便。而socket也同样可以看作一个接口,它位于传输层和应用层之间,使得使用者可以直接从应用层操作而不需要考虑传输层
如下图,使用者只需要在应用层操作socket开发接口,选择相应选项并赋予相应信息,就可以实现通信

Windows下的socket

socket编程接口起源与UNIX操作系统,后静发展,微软公司规范了Windows下的socket,全面继承了socket网络编程接口,这些接口几乎和UNIX下相同。差异在于:头文件和静态库、socket语法、初始化等。

Windows下构建WinSock应用程序框架

头文件与库

需要包含的头文件与库文件有两组,第二种实现了网络通信功能,现多数情况使用第二种:
#include <winsock.h>
#pragma comment(lib,“wsock32.lib”)

#include <winsock2.h>
#pragma comment(lib,“ws2_32.lib”)

结构体WSADATA

该结构体用于存储调用WSAStartup(socket的初始化函数,后文会讲解)函数后返回的Windows Socket数据,它包含了编程使用的具体信息

typedef struct WSAData {WORD                    wVersion;WORD                    wHighVersion;
#ifdef _WIN64unsigned short          iMaxSockets;unsigned short          iMaxUdpDg;char FAR *              lpVendorInfo;char                    szDescription[WSADESCRIPTION_LEN+1];char                    szSystemStatus[WSASYS_STATUS_LEN+1];
#elsechar                    szDescription[WSADESCRIPTION_LEN+1];char                    szSystemStatus[WSASYS_STATUS_LEN+1];unsigned short          iMaxSockets;unsigned short          iMaxUdpDg;char FAR *              lpVendorInfo;
#endif
} WSADATA, FAR * LPWSADATA;
字段 含义
wVersion Windows Sockets DLL期望调用者使用的Windows Sockets规范的版本,为WORD类型。高位字节中存储副版本号,低位字节中存储主版本号。可以使用MAKEWORDO函数返回该值,例如 MAKEWORD(2,2)
wHighVersion Windows Sockets DLL可以支持的 Windows Sockets规范的最高版本
szDescription 以null结尾的ASCII字符串。Windows Sockets DLL将对 Windows Sockets实现的描述复制到该字符串中,最多可以包含256个字符
szSystemStatus 以null结尾的ASCII字符串。Windows Sockets DLL将有关状态或配置信息复制到该字符串中
iMaxSockets 单个进程可以打开的最大Socket 数量。Windows Sockets可以提供一个全局的Socket,为每个进程分配 Socket资源。程序员可以使用该数字作为 WindowsSockets是否可以被应用程序使用的原始依据
iMaxUdpDg Windows Socket应用程序能够发送或接收的最大UDP数据包大小,单位为字节。如果没有限制,则等于0
lpVendorInfo 指向销售商数据的指针

初始化函数WSAStartsup()、清除函数WSACleanup()

WSAStartup函数用于初始化Windows sockets,并返回SWADATA结构体(上面的那个结构体)即具体信息,只有调用该函数进行初始化后,应用程序才能正常调用其它的Windows socket API函数,实现网络通信。

WSAStartup(_In_ WORD wVersionRequested,_Out_ LPWSADATA lpWSAData);

参数说明:

  • wVersionRequested:调用者使用的版本,WORD类型,即高字节储存副版本号,低字节储存主版本号。通常使用MAKEWORD()函数返回该值,例如:MAKEWORD(2,2).
  • loWSAData:指向WSADATA结构体的指针,接收数据,使用中通常将一个WSADATA结构体引用传入作为出参

WSACleanup()函数用于清除工作,若返回SOCKET_ERROR则清除出错

网络编程的常用辅助函数

  • unsigned long inet_addr(const char* cp),可将点分十进制的IP转换为unsigned long 类型的网络字节序格式
  • u_short htons(u_short hostshort)、u_long htonl(u_long netlong)将主机字节序转为网络字节序
  • u_short ntohs(u_short netshort)、ulong ntohl(u_long netlong)将网络字节序转为主机字节序

例子:通过一个控制应用程序实现初始化一个Windows Sockets 并打印具体信息

#include <iostream>
#include <winsock2.h>
#pragma comment (lib,"ws2_32.lib")
using std::cout;
using std::endl;
int main()
{WSADATA wsaData;if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0){printf("WSAStartup error\n");return 0;}//打印相关信息cout << "Version is :" << LOBYTE(wsaData.wVersion) << "." << HIBYTE(wsaData.wVersion) << endl;cout << "High Version is :" << LOBYTE(wsaData.wHighVersion) << "." << HIBYTE(wsaData.wHighVersion) << endl;cout << "Description: " << wsaData.szDescription << endl;cout << "SystemStatus: " << wsaData.szSystemStatus << endl;cout << "Max Count Socket:" << wsaData.iMaxSockets << endl;cout << "Max UdnDn: " << wsaData.iMaxUdpDg << endl;//清除工作if (WSACleanup() == SOCKET_ERROR)printf("WSACleanup error\n");return 0;
}

网络——Windows下的网络编程入门相关推荐

  1. (6)Windows下的网络编程

    目录索引 Windows下的网络编程 接口分析 编程差异 编程示例 多路复用 Windows下的网络编程 接口分析 Windows下的socket编程接口与Linux中几乎相同: 不同之处: – 返回 ...

  2. Windows下的网络编程Winsock

    文章目录 前言 1.服务器下的Winsock 1.1.构建编程环境: 1.2.WSAData结构体 1.3.WSAStartup初始化Winsock 1.4.WSACleanup释放Winsock 1 ...

  3. Windows XP下Service的编程入门[2]

    Windows XP下Service的编程入门[2] // _dse.cpp : Defines the entry point for the console application. // 作者: ...

  4. Windows XP下Service的编程入门[1]

    Windows XP下Service的编程入门[1] // _dse.cpp : Defines the entry point for the console application. // 作者: ...

  5. windows下的网络配置

    鉴于好多朋友不会在windows下配置网络导致在使用网络过程中出现各种问题,例如:能够ping的通局域网中其他的主机,但是就是不能"上网",或者QQ能够登录但是wab网页就是打不开 ...

  6. Windows下常用网络命令,基础中的基础

    Windows下常用网络命令 导航 4. ping 命令 5. arp 命令 6. netstat 命令 7. route 命令 8 . nbtstat 命令:用于提供关于关于 netbios 的统计 ...

  7. linux操作系统下 c语言编程入门

    linux操作系统下 c语言编程入门 (一)目录介绍 1)Linux程序设计入门--基础知识 2)Linux程序设计入门--进程介绍 3)Linux程序设计入门--文件操作 4)Linux程序设计入门 ...

  8. linux操作系统下c语言编程入门

    linux操作系统下c语言编程入门  整理编写:007xiong  原文:Hoyt等 (一)目录介绍 1)Linux程序设计入门--基础知识  2)Linux程序设计入门--进程介绍  3)Linux ...

  9. 【转贴】linux操作系统下c语言编程入门

    [转贴]linux操作系统下c语言编程入门 发信人: Lerry (驴是的念来过倒·杏红等头墙上爬), 信区: Linux 标 题: linux操作系统下c语言编程入门 发信站: 哈工大紫丁香 (Fr ...

最新文章

  1. 机器学习基础专题:线性判别器
  2. Hackerrank GCD Product(莫比乌斯反演)
  3. Android 7.0解决抓取不到https请求的问题
  4. 推荐一些不错的开源免费易上手的web前端框架
  5. Excel制作考勤管理
  6. 辽宁活跃ip段_有泰国女排影子!激情辽宁女排,打出快乐排球,输了比赛赢了球迷...
  7. 从0到1使用Kubernetes系列(四):搭建第一个应用程序
  8. 50 行代码教 AI 实现动作平衡 | 附完整代码
  9. 多租户数据中心采用SDN的优势和挑战
  10. 我的世界1.12.2java下载_我的世界1.12.2电脑版下载
  11. ASP.NET中Button控件的CommandName和CommandArgument属性用法
  12. R语言︱线性混合模型理论与案例探究(固定效应随机效应)
  13. 中建政研马海顺-PPP项目EPC工程总承包全过程管控与风险防范
  14. 港股美股打新截然不同!教你玩转美股打新
  15. python扫描局域网端口和ip_如何高效实现扫描局域网IP、主机名、MAC和端口
  16. IT程序猿攻城狮学习资料汇总
  17. css translate 坐标,translate()
  18. 性能调优--gzip、缓存、content-download、逐针渲染、Queueing、动态延迟加载、最小化主线程工作
  19. 32位、64位操作系统系统差异对比
  20. BeanFactory 和 ApplicationContext的区别

热门文章

  1. 论文写作——如何作图(visio/ppt+Adobe Acrobat Pro)
  2. Windows和Mac常用网络测试命令
  3. 【太虚AR_v0.1】使用教程 | 云识别(图像识别)
  4. Gradle依赖项之transitive/exclude/force/(+)
  5. OpenCV钢铁平面焊接的缺陷检测案例
  6. VMware虚拟机三种联网方法及原理和Linux 三种网络
  7. 图像卷积与滤波的一些知识点
  8. ubuntu卸载mysql
  9. 自然语言处理--词向量
  10. 关于HTTP Authorization