网络——Windows下的网络编程入门
作者:小 琛
欢迎转载,请标明出处
引言:之前关于网络编程的博文都是基于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下的网络编程入门相关推荐
- (6)Windows下的网络编程
目录索引 Windows下的网络编程 接口分析 编程差异 编程示例 多路复用 Windows下的网络编程 接口分析 Windows下的socket编程接口与Linux中几乎相同: 不同之处: – 返回 ...
- Windows下的网络编程Winsock
文章目录 前言 1.服务器下的Winsock 1.1.构建编程环境: 1.2.WSAData结构体 1.3.WSAStartup初始化Winsock 1.4.WSACleanup释放Winsock 1 ...
- Windows XP下Service的编程入门[2]
Windows XP下Service的编程入门[2] // _dse.cpp : Defines the entry point for the console application. // 作者: ...
- Windows XP下Service的编程入门[1]
Windows XP下Service的编程入门[1] // _dse.cpp : Defines the entry point for the console application. // 作者: ...
- windows下的网络配置
鉴于好多朋友不会在windows下配置网络导致在使用网络过程中出现各种问题,例如:能够ping的通局域网中其他的主机,但是就是不能"上网",或者QQ能够登录但是wab网页就是打不开 ...
- Windows下常用网络命令,基础中的基础
Windows下常用网络命令 导航 4. ping 命令 5. arp 命令 6. netstat 命令 7. route 命令 8 . nbtstat 命令:用于提供关于关于 netbios 的统计 ...
- linux操作系统下 c语言编程入门
linux操作系统下 c语言编程入门 (一)目录介绍 1)Linux程序设计入门--基础知识 2)Linux程序设计入门--进程介绍 3)Linux程序设计入门--文件操作 4)Linux程序设计入门 ...
- linux操作系统下c语言编程入门
linux操作系统下c语言编程入门 整理编写:007xiong 原文:Hoyt等 (一)目录介绍 1)Linux程序设计入门--基础知识 2)Linux程序设计入门--进程介绍 3)Linux ...
- 【转贴】linux操作系统下c语言编程入门
[转贴]linux操作系统下c语言编程入门 发信人: Lerry (驴是的念来过倒·杏红等头墙上爬), 信区: Linux 标 题: linux操作系统下c语言编程入门 发信站: 哈工大紫丁香 (Fr ...
最新文章
- 机器学习基础专题:线性判别器
- Hackerrank GCD Product(莫比乌斯反演)
- Android 7.0解决抓取不到https请求的问题
- 推荐一些不错的开源免费易上手的web前端框架
- Excel制作考勤管理
- 辽宁活跃ip段_有泰国女排影子!激情辽宁女排,打出快乐排球,输了比赛赢了球迷...
- 从0到1使用Kubernetes系列(四):搭建第一个应用程序
- 50 行代码教 AI 实现动作平衡 | 附完整代码
- 多租户数据中心采用SDN的优势和挑战
- 我的世界1.12.2java下载_我的世界1.12.2电脑版下载
- ASP.NET中Button控件的CommandName和CommandArgument属性用法
- R语言︱线性混合模型理论与案例探究(固定效应随机效应)
- 中建政研马海顺-PPP项目EPC工程总承包全过程管控与风险防范
- 港股美股打新截然不同!教你玩转美股打新
- python扫描局域网端口和ip_如何高效实现扫描局域网IP、主机名、MAC和端口
- IT程序猿攻城狮学习资料汇总
- css translate 坐标,translate()
- 性能调优--gzip、缓存、content-download、逐针渲染、Queueing、动态延迟加载、最小化主线程工作
- 32位、64位操作系统系统差异对比
- BeanFactory 和 ApplicationContext的区别