Winsock 的初始化
首先是调用 WSAStartup()
来加载合适的 Winsock Dll版本
其中两个参数
WORD wVersionRequested
加载库的版本
LPWSADATA lpWSAData
关于版本信息的结构体
typedef struct WSAData {
WORD(_16) wVersion; //winsocket的版本号
//Windows XP 的版本是2.2
WORD wHighVersion; //winsocket的最高版本
char szDescription[WSADESCRIPTION_LEN+1]; //winsocket实现的句柄字符串
char szSystemStatus[WSASYS_STATUS_LEN+1]; //winsocker的配置信息
unsigned short iMaxSockets; //最大socket数量,由系统资源决定,不确定
unsigned short iMaxUdpDg; //通过WSAEnumProtocols()具体查询
char FAR * lpVendorInfo; //far 指针的长度是32位
//near指针的长度是16位
//#define FAR far
} WSADATA, FAR * LPWSADATA;
载入2.2版本得到的信息
wVersion:514
wHighVersion:514
szDescription:WinSock 2.0
szSystemStatus:Running
iMaxSockets:0
iMaxUdpDg:0
调用成功返回0,不成功返回10092
#define WSAVERNOTSUPPORTED (WSABASEERR+92)
当完成了对socket的操作以后
应当调用 WSACleanup() 释放掉 winsock申请的资源.
Winsock 调用错误最常见的返回值的SOCKET_ERROR
#define SOCKET_ERROR (-1)
如果调用winsock的函数出现错误 可以通过
WSAGetLastError()来取得对应的错误代码
注意:
WSAGetLastError()本身也是winsock的函数
所以要对其调用成功,必须先初始化winsock DLL
一个简单的Winsock DLL初始化 和 释放
#include <winsock2.h>
#include <iostream>
using namespace std;
int main()
{
WSADATA WSAData;
int ret;
if( ret = WSAStartup(0x0, &WSAData) )
{
cout << "Can not initilize winsock.dll" << endl;
cout << "Error Code:" << WSAGetLastError() << endl;
return 1;
}
else
{
cout << "winsock.dll loded" << endl;
}
WSACleanup();
//也应该检查该函数是否执行成功
return 0;
}
初始化Winsock
什么是Winsock
Winsock是Windows下的网络编程接口,它是由Unix下的BSD Socket发展而来,是一个与网络协议无关的编程接口。
构建编程环境
Winsock在常见的Windows平台上有两个主要的版本,即Winsock1和Winsock2。编写与Winsock1兼容的程序你需要引用头文 件WINSOCK.H,如果编写使用Winsock2的程序,则需要引用WINSOCK2.H。此外还有一个MSWSOCK.H头文件,它是专门用来支持 在Windows平台上高性能网络程序扩展功能的。使用WINSOCK.H头文件时,同时需要库文件WSOCK32.LIB,使用WINSOCK2.H 时,则需要WS2_32.LIB,如果使用MSWSOCK.H中的扩展API,则需要MSWSOCK.LIB。正确引用了头文件,并链接了对应的库文件, 你就构建起编写WINSOCK网络程序的环境了。
初始化Winsock
每个Winsock程序必须使用WSAStartup载入合适的Winsock动态链接库,如果载入失败,WSAStartup将返回SOCKET_ERROR,这个错误就是WSANOTINITIALISED,WSAStartup的定义如下:
int WSAStartup(
WORD wVersionRequested,
LPWSADATA lpWSAData
);
wVersionRequested指定了你想载入的Winsock版本,其高字节指定了次版本号,而低字节指定了主版本号。你可以使用宏 MAKEWORD(x, y)来指定版本号,这里x代表主版本,而y代表次版本。lpWSAData是一个指向WSAData结构的指针,WSAStartup会向该结构中填充其 载入的Winsock动态链
库的信息。
lpWSAData是一个指向WSAData结构的指针,WSAStartup会向该结构中填充其载入的Winsock动态链
库的信息。
lpWSAData是一个指向WSAData结构的指针,WSAStartup会向该结构中填充其载入的Winsock动态链
库的信息。
typedef struct WSAData
{
WORD wVersion;
WORD wHighVersion;
char szDescription[WSADESCRIPTION_LEN + 1];
char szSystemStatus[WSASYS_STATUS_LEN + 1];
unsigned short iMaxSockets;
unsigned short iMaxUdpDg;
char FAR * lpVendorInfo;
} WSADATA, * LPWSADATA;
wVersion为你将使用的Winsock版本号,wHighVersion为载入的Winsock动态库支持的最高版本,注意,它们的高字节代表次版本,低字节代表主版本。
szDescription与szSystemStatus由特定版本的Winsock设置,实际上没有太大用处。
iMaxSockets表示最大数量的并发Sockets,其值依赖于可使用的硬件资源。
iMaxUdpDg表示数据报的最大长度;然而,获取数据报的最大长度,你需要使用WSAEnumProtocols对协议进行查询。
最大数量的并发Sockets并不是什么神奇的数字,它是由可用的物理资源来决定的.
lpVendorInfo是为Winsock实现而保留的制造商信息,这个在Windows平台上并没有什么用处.
自Windows 95以后的操作系统都支持Winsock 2.2的版本.即使是这样,你也不能认为这些Windows平台支持最新的Winsock版本,为了让你的程序能够运行于大多数平台,最好使用Winsock1.1规范.
当你使用完Winsock接口后,要调用下面的函数对其占用的资源进行释放:
int WSACleanup(void);
如果调用该函数失败也没有什么问题,因为操作系统为自动将其释放,对应于每一个WSAStartup调用都应该有一个WSACleanup调用.
错误处理
Winsock函数调用失败大多会返回 SOCKET_ERROR(实际上就是-1),你可以调用WSAGetLastError得到错误的详细信息:
int WSAGetLastError (void);
对该函数的调用将返回一个错误码,其码值在WINSOCK.H或WINSOCK2.H(根据其版本)中已经定义,这些预定义值都以WSAE开头.同时你还可以使用WSASetLastError来自定义错误码值.
以下是一个使用上述知识初始化Winsock的一个例子(记得要引用Winsock的lib库).
#include <winsock2.h>
#include <stdio.h>
void main(void)
{
WSADATA wsaData;
int Ret;
// Initialize Winsock version 2.2
if ((Ret = WSAStartup(MAKEWORD(2,2), &wsaData)) != 0)
{
// NOTE: Since Winsock failed to load we cannot use
// WSAGetLastError to determine the specific error for
// why it failed. Instead we can rely on the return
// status of WSAStartup.
printf("WSAStartup failed with error %d\n", Ret);
return;
}
// Setup Winsock communication code here
// When your application is finished call WSACleanup
if (WSACleanup() == SOCKET_ERROR)
{
printf("WSACleanup failed with error %d\n", WSAGetLastError());
}
}
Winsock 的初始化相关推荐
- Winsock的初始化与销毁(WSAStartup)
在进行Winsock编程时,首先需要导入头文件: #include <winsock2.h> 其次需要调用WSAStartup(设置Winsock的版本,并初始化对应的库) int WSA ...
- Windows/Linux TCP Socket网络编程简介及测试代码
典型的网络应用是由一对程序(即客户程序和服务器程序)组成的,它们位于两个不同的端系统中.当运行这两个程序时,创建了一个客户进程和一个服务器进程,同时它们通过从套接字(socket)读出和写入数据在彼此 ...
- ipconfig的C语言实现
首先,这篇文章实现了两种方法查询IP,实现截图如下: 第一种方法时调用系统命令,代码如下: #include <cstdlib> #include <iostream> usi ...
- [计算机网络] C++模拟telnet登陆SMTP服务发送邮件过程
在百度文库中的<使用telnet协议收发邮件>,我们可以很清楚地看到如何通过telnet来进行发送邮件,下面是一些需要用到的命令,通过以下命令可以很容易实现邮件发送功能.为了更好地理解其中 ...
- 游戏外挂设计技术探讨
一. 前言 所谓游戏外挂,其实是一种游戏外辅程序,它可以协助玩家自动产生游戏动作.修改游戏网络数据包以及修改游戏内存数据等,以实现玩家用最少的时间和金钱去完成功力升级和过关斩将.虽然,现在对游戏外挂程 ...
- Windows Sockets错误标识及对应解释
WSAETIMEDOUT 对应 linux 的 ETIMEDOUT WSAETIMEDOUT 对应 linux 的 ETIMEDOUT IdWinsock2.pas 文件中也有说明. Windows ...
- 游戏外挂的基本编写原理
游戏外挂的基本编写原理 Posted on 2005年9月17日 23:40 游戏外挂的基本编写原理 本文主要是针对开发游戏外挂程序后期使用的程序开发技术进行探讨,重点介绍的 如下几种在游戏外挂中常使 ...
- 64位虚拟机下asm()语法_一步步学写Windows下的Shellcode
如何在WIndows下编写一个shellcode?为什么会问这个问题,前段时间在做win下的Exploit,但是都是使用大佬写的shellcode,无法实现个人的一些需求.而网络上编写shellcod ...
- DELPHI下的SOCK编程(转)
DELPHI下的SOCK编程 本文是写给公司新来的程序员的,算是一点培训的教材.本文不会涉及太多的编程细节,只是简单讲解在DELPHI下进行Winsock编程最好了解的知识. 题外话:我认 ...
最新文章
- 什么是多重共线性问题?如何判别多重共线性问题?怎么避免多重共线性对模型和学习的干扰?
- 模块20135304——刘世鹏
- c++ 获取线程id_高效获取当前线程的 id
- CodeForces - 715A Plus and Square Root(思维+构造)
- 数据结构与算法之母牛生牛
- 单片机里面的CPU使用率是什么鬼?
- 被绞杀的网景:互联网门口第一滴血,互联网营销
- python操作access数据库未发现数据源名称_ASP连接ACCESS数据库失败,提示“未发现数据源名称并且未指定默认驱动程序”...
- Mybatis使用IN语句查询
- Python3回文相关算法小结
- pig连接oracle数据库,Pig安装讲解
- 计算机一级考试第一套题电子表格,计算机等级考试一级上机试题(第一套)
- python ico_Python协程asynico模块解读
- 组策略:交互式登录:不显示最后的用户名
- 昇腾万里·让AI无所不及!DevRun开发者沙龙在武汉成功举办
- 十八、完成登录与注册页面的前端
- BZOJ1176[Balkan2007] Mokia
- Excel·VBA破解密码
- 梦幻西游易语言辅助教程
- 第二章 02 天牛质感