网络 |
您所在的位置:网站首页 › 网络编程入门教程 › 网络 |
作者:小 琛 欢迎转载,请标明出处 引言:之前关于网络编程的博文都是基于Linux环境下,而因为后续工作的原因,开发环境为Windows故而学习该内容。实际学习中发现,整个编程思路和流程并没有很大差别,仅仅在于些许语法和库文件上。 文章目录 socket、Windows下的socketWindows下构建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 #pragma comment(lib,“wsock32.lib”) 或 #include #pragma comment(lib,“ws2_32.lib”) 结构体WSADATA该结构体用于存储调用WSAStartup(socket的初始化函数,后文会讲解)函数后返回的Windows Socket数据,它包含了编程使用的具体信息 typedef struct WSAData { WORD wVersion; WORD wHighVersion; #ifdef _WIN64 unsigned short iMaxSockets; unsigned short iMaxUdpDg; char FAR * lpVendorInfo; char szDescription[WSADESCRIPTION_LEN+1]; char szSystemStatus[WSASYS_STATUS_LEN+1]; #else char szDescription[WSADESCRIPTION_LEN+1]; char szSystemStatus[WSASYS_STATUS_LEN+1]; unsigned short iMaxSockets; unsigned short iMaxUdpDg; char FAR * lpVendorInfo; #endif } WSADATA, FAR * LPWSADATA; 字段含义wVersionWindows Sockets DLL期望调用者使用的Windows Sockets规范的版本,为WORD类型。高位字节中存储副版本号,低位字节中存储主版本号。可以使用MAKEWORDO函数返回该值,例如 MAKEWORD(2,2)wHighVersionWindows 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是否可以被应用程序使用的原始依据iMaxUdpDgWindows Socket应用程序能够发送或接收的最大UDP数据包大小,单位为字节。如果没有限制,则等于0lpVendorInfo指向销售商数据的指针 初始化函数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 #include #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 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |