您的位置 首页 > 系统更新

winsock.dll_winsock库安装

1.Qt提供的socket编程库支持Winsock类似的模式,端口重叠模式等这些模式吗?

2.(VB)WINSOCK发送数据库数据

3.windows socket,windows socket api,CAsyncSocket,Csocket和Winsock这几者之间什么关系

4.200分求一段代码,用C++获取本机IP地址

5.Winsocket API 使用

winsock.dll_winsock库安装

如何来解决三个最常bai见的连接错误du。

cmd.Netstat -at

第一个错误"SQL Server 不存在或访问被拒绝zhi"通常是最复dao杂的,错误发生的原因比较多,需要检查的方面也比较多。一般说来,有以下几种可能性:

1、SQL Server名称或IP地址拼写有误;

2、服务器端网络配置有误;

3、客户端网络配置有误。

要解决这个问题,我们一般要遵循以下的步骤来一步步找出导致错误的原因。

首先,检查网络物理连接:

ping <服务器IP地址> 或者 ping <服务器名称>

如果 ping <服务器IP地址> 失败,说明物理连接有问题,这时候要检查硬件设备,如网卡、HUB、路由器等。还有一种可能是由于客户端和服务器之间安装有防火墙软件造成的,比如 ISA Server。防火墙软件可能会屏蔽对 ping、te.Net 等的响应,因此在检查连接问题的时候,我们要先把防火墙软件暂时关闭,或者打开所有被封闭的端口。

如果ping <服务器IP地址> 成功而 ping <服务器名称> 失败,则说明名字解析有问题,这时候要检查 DNS 服务是否正常。有时候客户端和服务器不在同一个局域网里面,这时候很可能无法直接使用服务器名称来标识该服务器,这时候我们可以使用HOSTS文件来进行名字解析,具体的方法是:

1、使用记事本打开HOSTS文件(一般情况下位于C:\WINNT\system32\drivers\etc).

2、添加一条IP地址与服务器名称的对应记录,如:

172.168.10.24 myserver

也可以在 SQL Server 的客户端网络实用工具里面进行配置,后面会有详细说明。

其次,使用 te.Net 命令检查SQL Server服务器工作状态:

te.Net <服务器IP地址> 1433

如果命令执行成功,可以看到屏幕一闪之后光标在左上角不停闪动,这说明 SQL Server 服务器工作正常,并且正在监听1433端口的 TCP/IP 连接;如果命令返回"无法打开连接"的错误信息,则说明服务器端没有启动 SQL Server 服务,也可能服务器端没启用 TCP/IP 协议,或者服务器端没有在 SQL Server 默认的端口1433上监听。

接着,我们要到服务器上检查服务器端的网络配置,检查是否启用了命名管道,是否启用了 TCP/IP 协议等等。我们可以利用 SQL Server 自带的服务器网络使用工具来进行检查。

点击:程序 -> Microsoft SQL Server -> 服务器网络使用工具,打开该工具后看到的画面如下图所示:

从这里我们可以看到服务器启用了哪些协议。一般而言,我们启用命名管道以及 TCP/IP 协议。

点中 TCP/IP 协议,选择"属性",我们可以来检查 SQK Server 服务默认端口的设置,如下图所示:

一般而言,我们使用 SQL Server 默认的1433端口。如果选中"隐藏服务器",则意味着客户端无法通过枚举服务器来看到这台服务器,起到了保护的作用,但不影响连接。

检查完了服务器端的网络配置,接下来我们要到客户端检查客户端的网络配置。我们同样可以利用 SQL Server 自带的客户端网络使用工具来进行检查,所不同的是这次是在客户端来运行这个工具。

点击:程序 -> Microsoft SQL Server -> 客户端网络使用工具, 打开该工具后看到的画面如下图所示:

从这里我们可以看到客户端启用了哪些协议。一般而言,我们同样需要启用命名管道以及 TCP/IP 协议。

点击 TCP/IP 协议,选择"属性",可以检查客户端默认连接端口的设置,如下图所示。

该端口必须与服务器一致。

单击"别名"选项卡,还可以为服务器配置别名。服务器的别名是用来连接的名称,连接参数中的服务器是真正的服务器名称,两者可以相同或不同。如下图中,我们可以使用myserver来代替真正的服务器名称sql2kcn-02,并且使用网络库 Named Pipes。别名的设置与使用HOSTS文件有相似之处。

通过以上几个方面的检查,错误 1 发生的原因基本上可以被排除。

下面我们再详细描述如何来解决错误 2。

当用户尝试在查询分析器里面使用sa来连接SQL Server,或者在企业管理器里面使用sa来新建一个SQL Server注册时,经常会遇到如图 2 所示的错误信息。该错误产生的原因是由于SQL Server使用了"仅 Windows"的身份验证方式,因此用户无法使用SQL Server的登录帐户(如 sa )进行连接。解决方法如下所示:

1、 在服务器端使用企业管理器,并且选择"使用 Windows 身份验证"连接上 SQL Server;

2、 展开"SQL Server组",鼠标右键点击SQL Server服务器的名称,选择"属性",再选择"安全性"选项卡;

3、 在"身份验证"下,选择"SQL Server和 Windows "。

4、 重新启动SQL Server服务。

在以上解决方法中,如果在第 1 步中使用"使用 Windows 身份验证"连接 SQL Server 失败,那么我们将遇到一个两难的境地:首先,服务器只允许了 Windows 的身份验证;其次,即使使用了 Windows 身份验证仍然无法连接上服务器。这种情形被形象地称之为"自己把自己锁在了门外",因为无论用何种方式,用户均无法使用进行连接。实际上,我们可以通过修改一个注册表键值来将身份验证方式改为 SQL Server 和 Windows 混合验证,步骤如下所示:

1、点击"开始"-"运行",输入regedit,回车进入注册表编辑器;

2、依次展开注册表项,浏览到以册表键:

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\MSSQLServer]

3、在屏幕右方找到名称"LoginMode",双击编辑双字节值;

4、将原值从1改为2,点击"确定";

5、关闭注册表编辑器;

6、重新启动SQL Server服务。

此时,用户可以成功地使用sa在企业管理器中新建SQL Server注册,但是仍然无法使用Windows身份验证模式来连接SQL Server。这是因为在 SQL Server 中有两个缺省的登录帐户:BUILTIN\Administrators 以及 <机器名>\Administrator 被删除。要恢复这两个帐户,可以使用以下的方法:

1、打开企业管理器,展开服务器组,然后展开服务器;

2、展开"安全性",右击"登录",然后单击"新建登录";

3、在"名称"框中,输入 BUILTIN\Administrators;

4、在"服务器角色"选项卡中,选择"System Administrators" ;

5、点击"确定"退出;

6、使用同样方法添加 <机器名>\Administrator 登录。

以册表键

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\MSSQLServer\LoginMode

的值决定了SQL Server将取何种身份验证模式。该值为1,表示使用Windows 身份验证模式;该值为2,表示使用混合模式(Windows 身份验证和 SQL Server 身份验证)。

看完如何解决前两个错误的方法之后,让我们来看一下如图 3 所示的第三个错误。

如果遇到第三个错误,一般而言表示客户端已经找到了这台服务器,并且可以进行连接,不过是由于连接的时间大于允许的时间而导致出错。这种情况一般会发生在当用户在Inte.Net上运行企业管理器来注册另外一台同样在Inte.Net上的服务器,并且是慢速连接时,有可能会导致以上的超时错误。有些情况下,由于局域网的网络问题,也会导致这样的错误。

要解决这样的错误,可以修改客户端的连接超时设置。默认情况下,通过企业管理器注册另外一台SQL Server的超时设置是 4 秒,而查询分析器是 15 秒(这也是为什么在企业管理器里发生错误的可能性比较大的原因)。具体步骤为:

1、在企业管理器中,选择菜单上的"工具",再选择"选项";

2、在弹出的"SQL Server企业管理器属性"窗口中,点击"高级"选项卡;

3、在"连接设置"下的"登录超时(秒)"右边的框中输入一个比较大的数字,如 20。

查询分析器中也可以在同样位置进行设置。

简单一点就是:

/**********************************/

1、先保证ping通

2、在dos下写入te.Net ip 1433不会报错

3、用ip连如企业管理器:

企业管理器-->右键SQlserver组-->新建sqlserver注册-->下一步-->写入远程实例名(IP,机器名)-->下一步-->选Sqlserver登陆-->下一步-->写入登陆名与密码(sa,pass)-->下一步-->下一步-->完成

4、如果还不行:

sqlserver服务器-->开始菜单-->SQLserver-->服务器网络实用工具-->启用 WinSock代理-->代理地址:(sqlserver服务器IP)-->代理端口-->1433-->OK了

5、如果还不行:

sqlserver客户端-->开始菜单-->SQLserver-->客户端网络实用工具-->别名-->添加-->写入别名如"大力"-->"网络库"选tcp/ip-->服务器名称写入远程ip或实例名-->OK了。

Qt提供的socket编程库支持Winsock类似的模式,端口重叠模式等这些模式吗?

Windows网络与通信程序设计(第2版)?王艳平?这本书写的非常好,我有本王艳平写的?windows程序设计,写得很好,我自己不做网络开发,就没有买网络的那本书!不过推荐你看看,真的很不错!

本书将编程方法、网络协议和应用实例有机结合起来,详细阐明Windows网络编程的各方面内容。本书首先介绍Windows平台上进行网络编程的基础知识,包括网络硬件、术语、协议、Winsock编程接口和各种I/O方法等;然后通过具体实例详细讲述当前流行的高性能可伸缩服务器设计、IP多播和Internet广播、P2P程序设计、原始套接字、SPI、协议驱动的开发和原始以太数据的发送、ARP欺骗技术、LAN和WAN上的扫描和侦测技术、个人防火墙与网络封包截获技术等;最后讲述IP帮助函数和E-mail的开发方法。?本书结构紧凑,内容由浅入...

第1章?计算机网络基础?1

1.1?网络的概念和网络的组成?1

1.2?计算机网络参考模型?2

1.2.1?协议层次?2

1.2.2?TCP/IP参考模型?2

1.2.3?应用层(Application?Layer)?3

1.2.4?传输层(Transport?Layer)?3

1.2.5?网络层(Network?Layer)?3

1.2.6?链路层(Link?Layer)?4

1.2.7?物理层(Physical?Layer)?4

1.3?网络程序寻址方式?4

1.3.1?MAC地址?4

1.3.2?IP地址?5

1.3.3?子网寻址?6

1.3.4?端口号?8

1.3.5?网络地址转换(NAT)?8

1.4?网络应用程序设计基础?10

1.4.1?网络程序体系结构?10

1.4.2?网络程序通信实体?11

1.4.3?网络程序开发环境?12

第2章?Winsock编程接口?13

2.1?Winsock库?13

2.1.1?Winsock库的装入和释放?13

2.1.2?封装CInitSock类?14

2.2?Winsock的寻址方式和字节顺序?14

2.2.1?Winsock寻址?14

2.2.2?字节顺序?16

2.2.3?获取地址信息?17

2.3?Winsock编程详解?20

2.3.1?Winsock编程流程?20

2.3.2?典型过程图?23

2.3.3?TCP服务器和客户端程序举例?24

2.3.4?UDP编程?26

2.4?网络对时程序实例?28

2.4.1?时间协议(Time?Protocol)?28

2.4.2?TCP/IP实现代码?29

第3章?Windows套接字I/O模型?31

3.1?套接字模式?31

3.1.1?阻塞模式?31

3.1.2?非阻塞模式?31

3.2?选择(select)模型?32

3.2.1?select函数?32

3.2.2?应用举例?33

3.3?WSAAsyncSelect模型?36

3.3.1?消息通知和WSAAsyncSelect函数?36

3.3.2?应用举例?37

3.4?WSAEventSelect模型?40

3.4.1?WSAEventSelect函数?40

3.4.2?应用举例?42

3.4.3?基于WSAEventSelect模型的服务器设计?44

3.5?重叠(Overled)I/O模型?53

3.5.1?重叠I/O函数?53

3.5.2?通知方式?56

3.5.3?基于重叠I/O模型的服务器设计?56

第4章?IOCP与可伸缩网络程序?67

4.1?完成端口I/O模型?67

4.1.1?什么是完成端口(completion?port)对象?67

4.1.2?使用IOCP的方法?67

4.1.3?示例程序?69

4.1.4?恰当地关闭IOCP?72

4.2?Microsoft扩展函数?72

4.2.1?GetAcceptExSockaddrs函数?73

4.2.2?TransmitFile函数?73

4.2.3?TransmitPackets函数?74

4.2.4?ConnectEx函数?75

4.2.5?DisconnectEx函数?76

4.3?可伸缩服务器设计注意事项?76

4.3.1?内存管理?76

4.3.2?接受连接的方法?77

4.3.3?恶意客户连接问题?77

4.3.4?包重新排序问题?78

4.4?可伸缩服务器系统设计实例?78

4.4.1?CIOCPServer类的总体结构?78

4.4.2?数据结构定义和内存池方案?82

4.4.3?自定义帮助函数?85

4.4.4?开启服务和停止服务?88

4.4.5?I/O处理线程?93

4.4.6?用户接口和测试程序?99

第5章?互联网广播和IP多播?100

5.1?套接字选项和I/O控制命令?100

5.1.1?套接字选项?100

5.1.2?I/O控制命令?102

5.2?广播通信?103

5.3?IP多播(Multicasting)?105

5.3.1?多播地址?105

5.3.2?组管理协议(IGMP)?105

5.3.3?使用IP多播?106

5.4?基于IP多播的组讨论会实例?110

5.4.1?定义组讨论会协议?110

5.4.2?线程通信机制?111

5.4.3?封装CGroupTalk类?111

5.4.4?程序界面?117

第6章?原始套接字?121

6.1?使用原始套接字?121

6.2?ICMP编程?121

6.2.1?ICMP与校验和的计算?121

6.2.2?Ping程序实例?124

6.2.3?路由跟踪?126

6.3?使用IP头包含选项?129

6.3.1?IP数据报格式?129

6.3.2?UDP数据报格式?131

6.3.3?原始UDP封包发送实例?133

6.4?网络嗅探器开发实例?134

6.4.1?嗅探器设计原理?135

6.4.2?网络嗅探器的具体实现?136

6.4.3?侦听局域网内的密码?138

6.5?TCP通信开发实例?140

6.5.1?创建一个原始套接字,并设置IP头选项?140

6.5.2?构造IP头和TCP头?140

6.5.3?发送原始套接字数据报?142

6.5.4?接收数据?146

第7章?Winsock服务提供者接口(SPI)?147

7.1?SPI概述?147

7.2?Winsock协议目录?148

7.2.1?协议特性?149

7.2.2?使用Winsock?API函数枚举协议?150

7.2.3?使用Winsock?SPI函数枚举协议?151

7.3?分层服务提供者(LSP)?153

7.3.1?运行原理?153

7.3.2?安装LSP?154

7.3.3?移除LSP?158

7.3.4?编写LSP?159

7.3.5?LSP实例?161

7.4?基于SPI的数据报过滤实例?165

7.5?基于Winsock的网络聊天室开发?171

7.5.1?服务端?171

7.5.2?客户端?171

7.5.3?聊天室程序的设计说明?172

7.5.4?核心代码分析?172

第8章?Windows网络驱动接口标准(NDIS)和协议驱动的开发?176

8.1?核心层网络驱动?176

8.1.1?Windows?2000及其后产品的网络体系结构?176

8.1.2?NDIS网络驱动程序?177

8.1.3?网络驱动开发环境?178

8.2?WDM驱动开发基础?181

8.2.1?UNICODE字符串?181

8.2.2?设备对象?181

8.2.3?驱动程序的基本结构?183

8.2.4?I/O请求包(I/O?request?packet,IRP)和I/O堆栈?183

8.2.5?完整驱动程序示例?186

8.2.6?扩展派遣接口?188

8.2.7?应用举例(进程诊测实例)?191

8.3?开发NDIS网络驱动预备知识?198

8.3.1?中断请求级别(Interrupt?Request?Level,IRQL)?198

8.3.2?旋转锁(Spin?Lock)?198

8.3.3?双链表?199

8.3.4?封包结构?199

8.4?NDIS协议驱动?200

8.4.1?注册协议驱动?200

8.4.2?打开下层协议驱动的适配器?201

8.4.3?协议驱动的封包管理?202

8.4.4?在协议驱动中接收数据?203

8.4.5?从协议驱动发送封包?204

8.5?NDIS协议驱动开发实例?204

8.5.1?总体设计?204

8.5.2?NDIS协议驱动的初始化、注册和卸载?206

8.5.3?下层NIC的绑定和解除绑定?209

8.5.4?发送数据?217

8.5.5?接收数据?219

8.5.6?用户IOCTL处理?225

第9章?网络扫描与检测技术?233

9.1?网络扫描基础知识?233

9.1.1?以太网数据帧?233

9.1.2?ARP?234

9.1.3?ARP格式?236

9.1.4?SendARP函数?237

9.2?原始以太封包的发送?238

9.2.1?安装协议驱动?238

9.2.2?协议驱动用户接口?238

9.2.3?发送以太封包的测试程序?244

9.3?局域网计算机扫描?245

9.3.1?管理原始ARP封包?246

9.3.2?ARP扫描示例?249

9.4?互联网计算机扫描?253

9.4.1?端口扫描原理?253

9.4.2?半开端口扫描实现?254

9.5?ARP欺骗原理与实现?259

9.5.1?IP欺骗的用途和实现原理?259

9.5.2?IP地址冲突?260

9.5.3?ARP欺骗示例?261

第10章?点对点(P2P)网络通信技术?264

10.1?P2P穿越概述?264

10.2?一般概念?265

10.2.1?NAT术语?265

10.2.2?中转?265

10.2.3?反向连接?266

10.3?UDP打洞?267

10.3.1?中心服务器?267

10.3.2?建立点对点会话?267

10.3.3?公共NAT后面的节点?267

10.3.4?不同NAT后面的节点?268

10.3.5?多级NAT后面的节点?269

10.3.6?UDP空闲超时?270

10.4?TCP打洞?271

10.4.1?套接字和TCP端口重用?271

10.4.2?打开点对点的TCP流?271

10.4.3?应用程序看到的行为?272

10.4.4?同步TCP打开?273

10.5?Internet点对点通信实例?273

10.5.1?总体设计?273

10.5.2?定义P2P通信协议?274

10.5.3?客户方程序?275

10.5.4?服务器方程序?287

10.5.5?测试程序?291

第11章?核心层网络封包截获技术?294

11.1?Windows网络数据和封包过滤概述?294

11.1.1?Windows网络系统体系结构图?294

11.1.2?用户模式下的网络数据过滤?295

11.1.3?内核模式下的网络数据过滤?296

11.2?中间层网络驱动PassThru?296

11.2.1?PassThru?NDIS中间层驱动简介?296

11.2.2?编译和安装PassThru驱动?2

11.3?扩展PassThru?NDIS?IM驱动——添加IOCTL接口?2

11.3.1?扩展之后的PassThru驱动(PassThruEx)概况?2

11.3.2?添加基本的DeviceIoControl接口?298

11.3.3?添加绑定枚举功能?302

11.3.4?添加ADAPT结构的引用计数?307

11.3.5?适配器句柄的打开/关闭函数?308

11.3.6?句柄通知?315

11.3.7?查询和设置适配器的OID信息?315

11.4?扩展PassThru?NDIS?IM驱动——添加过滤规则?323

11.4.1?需要考虑的事项?323

11.4.2?过滤相关的数据结构?324

11.4.3?过滤列表?326

11.4.4?网络活动状态?327

11.4.5?IOCTL控制代码?328

11.4.6?过滤数据?331

11.5?核心层过滤实例?339

第12章?Windows网络防火墙开发技术?342

12.1?防火墙技术概述?342

12.2?金羽(Phoenix)个人防火墙浅析?343

12.2.1?金羽(Phoenix)个人防火墙简介?343

12.2.2?金羽(Phoenix)个人防火墙总体设计?344

12.2.3?金羽(Phoenix)个人防火墙总体结构?345

12.3?开发前的准备?345

12.3.1?常量的定义?346

12.3.2?访问规则?348

12.3.3?会话结构?348

12.3.4?文件结构?349

12.3.5?UNICODE支持?355

12.4?应用层DLL模块?356

12.4.1?DLL工程框架?356

12.4.2?共享数据和IO控制?362

12.4.3?访问控制列表ACL(Access?List)?364

12.4.4?查找应用程序访问权限的过程?367

12.4.5?类的接口——检查函数?370

12.5?核心层SYS模块?373

12.6?主模块工程?375

12.6.1?I/O控制类?375

12.6.2?主应用程序类?377

12.6.3?主对话框中的属性页?380

12.6.4?主窗口类?381

12.7?防火墙页面?383

12.7.1?网络访问监视页面?383

12.7.2?应用层过滤规则页面?387

12.7.3?核心层过滤规则页面?3

12.7.4?系统设置页面?403

第13章?IP帮助函数?406

13.1?IP配置信息?406

13.1.1?获取网络配置信息?406

13.1.2?管理网络接口?408

13.1.3?管理IP地址?412

13.2?获取网络状态信息?415

13.2.1?获取TCP连接表?415

13.2.2?获取UDP监听表?418

13.2.3?获取IP统计数据?420

13.3?路由管理?427

13.3.1?获取路由表?427

13.3.2?管理特定路由?431

13.3.3?修改默认网关的例子?432

13.4?ARP表管理?433

13.4.1?获取ARP表?433

13.4.2?添加ARP入口?434

13.4.3?删除ARP入口?434

13.4.4?打印ARP表的例子?434

13.5?进程网络活动监视实例?438

13.5.1?获取通信的进程终端?438

13.5.2?Netstate源程序代码?439

第14章?Email协议及其编程?444

14.1?概述?444

14.2?电子邮件介绍?445

14.2.1?电子邮件Internet的地址?445

14.2.2?Internet邮件系统?445

14.2.3?电子邮件信头的结构及分析?446

14.3?SMTP原理?448

14.3.1?SMTP原理分析?448

14.3.2?SMTP工作机制?449

14.3.3?SMTP命令码和工作原理?449

14.3.4?SMTP通信模型?450

14.3.5?SMTP的命令和应答?451

14.4?POP3协议原理?452

14.4.1?POP3协议简介?452

14.4.2?POP3工作原理?453

14.4.3?POP3命令原始码?454

14.4.4?POP3会话实例?459

14.5?实例分析与程序设计?460

14.5.1?总界面设计?460

14.5.2?SMTP客户端设计?461

14.5.3?POP3客户端设计?473

(VB)WINSOCK发送数据库数据

我觉得这个根QT没关系吧,用一个工作线程处理所有客户端套接字请求,只要你能分清各客户端的请求,并且执行效率够就行吧。我做多线程,一个工作线程处理8个串口的数据,只要分清哪个请求是哪个口的,哪个操作跟哪个口有关就行吧。

windows socket,windows socket api,CAsyncSocket,Csocket和Winsock这几者之间什么关系

一个表的数据只组成一个字符串,并把表名加在里面就行了。

你可以找一些字符分割,比如@字符前是表名,!分割每条记录,#分割一条记录中的每个字段。具体用哪个字符你可以自己设定。

当然你选的字符要表的数据里面没有,或者做转意,如果表数据里面有&,变成两个&&,这样在分析的时候再转回来。

当然楼下的用XML方式传输也行,这个标准点,不过数据量大,你要找一下XML的函数开发包什么的。

***************************

第一次回复:

winsock不可以直接发送表吧。一般只能发送字符串。

你可以在服务器程序中把表转换成可分析的字符串,然后用winsock把字符串发送给客户端,然后客户端再在程序里把可分析的字符串转换成表就可以了。

200分求一段代码,用C++获取本机IP地址

api的意思就是应用程序接口,winsock里面的套接字函数就是接口了,也就是api。

可以这样理解,学习winsock就是学习winsock api以及其中的一些机理。因为你用winsock实际上不也就是在用winsock里的函数么。

CAsyncSocket和Csocket都是MFC里的类。微软为了帮助大家做C++开发,同时也为了销售它的VC++,推出了一套用于开发windows程序的C++库叫MFC。

你说的CAsyncSocket和Csocke就是MFC库里关于套接字的类。

CAsyncSocket和Csocke既然是MFC库里的,自然就是一套便利的库,方便你写网络程序。

习惯上如果你是想做MFC程序,那么就直接用CAsyncSocket和Csocke这样的MFC里的方法来开发你的网络程序,如果你不做MFC程序,那么就直接用winsock吧。

还有什么需要补充的么~

Winsocket API 使用

#include<stdio.h>

#include<winsock2.h>

#pragma comment(lib,"ws2_32.lib")

void CheckIP(void) //定义CheckIP()函数,用于获取本机IP地址

{

WSADATA wsaData;

char name[255];//定义用于存放获得的主机名的变量

char *ip;//定义IP地址变量

PHOSTENT hostinfo;

//调用MAKEWORD()获得Winsock版本的正确值,用于加载Winsock库

if ( WSAStartup( MAKEWORD(2,0), &wsaData ) == 0 ) {

//现在是加载Winsock库,如果WSAStartup()函数返回值为0,说明加载成功,程序可以继续

if( gethostname ( name, sizeof(name)) == 0) {

//如果成功地将本地主机名存放入由name参数指定的缓冲区中

if((hostinfo = gethostbyname(name)) != NULL) {

//这是获取主机名,如果获得主机名成功的话,将返回一个指针,指向hostinfo,hostinfo

//为PHOSTENT型的变量,下面即将用到这个结构体

ip = inet_ntoa (*(struct in_addr *)*hostinfo->h_addr_list);

//调用inet_ntoa()函数,将hostinfo结构变量中的h_addr_list转化为标准的点分表示的IP

//地址(如192.168.0.1)

printf("%s\n",ip);//输出IP地址

}

}

WSACleanup( );//卸载Winsock库,并释放所有

} }

int main(void)

{

CheckIP();

return 0;

}

我写了很久的哦

一,WinSock简介

Socket(套接字)最初是由加利福尼亚大学Berkeley(伯克利)分校为UNIX操作系统开发的网络通信接口,随着UNIX的广泛使用,Socket成为当前最流行的网络通信应用程序接口之一。20世纪90年代初,由Sun Microsystems,JSB,FTP software,Microdyne和Microsoft等几家公司共同定制了一套标准,即Windows Socket规范,简称WinSock。

VB编写网络程序主要有两种方式:1.winsock控件 2.winsockAPI

二,WinSock控件的使用

1.WinSock控件的主要属性

a.Protocol属性

通过Protocol属性可以设置WinSock控件连接远程计算机使用的协议。可选的协议是TCP和UDP对应的VB的常量分别是sckTCPProtocol和sckUDPProtocol,Winsock控件默认协议是TCP。注意:虽然可以在运行时设置协议,但必须在连接未建立或断开连接后。

b.SocketHandle属性

SocketHandle返回当前socket连接的句柄,这是只读属性。

c.RemoteHostIP属性

RemoteHostIP属性返回远程计算机的IP地址。在客户端,当使用了控件的Connect方法后,远程计算机的IP地址就赋给了RemoteHostIP属性,而在服务器端,当ConnectRequest后,远程计算机(客户端)的IP地址就赋给了这个属性。如果使用的是UDP协议那么当DataArrival后,发送UDP报文的计算机的IP才赋给了这个属性。

d.ByteReceived属性

返回当前接收缓冲区中的字节数

e.State属性

返回WinSock控件当前的状态

常数 值 描述

sckClosed 0 缺省值,关闭。

SckOpen 1 打开。

SckListening 2 侦听

sckConnectionPending 3 连接挂起

sckResolvingHost 4 识别主机。

sckHostResolved 5 已识别主机

sckConnecting 6 正在连接。

sckConnected 7 已连接。

sckClosing 8 同级人员正在关闭连接。

sckError 9 错误

2.WinSock主要方法

a.Bind方法

用Bind方法可以把一个端口号固定为本控件使用,使得别的应用程序不能再使用这个端口。

b.Listen方法

Listen方法只在使用TCP协议时有用。它将应用程序置于监听检测状态。

c.Connect方法

当本地计算机希望和远程计算机建立连接时,就可以调用Connect方法。

Connect方法调用的规范为:

Connect RemoteHost,RemotePort

d.Accept方法

当服务器接收到客户端的连接请求后,服务器有权决定是否接受客户端的请求。

e.SendData方法

当连接建立后,要发送数据就可以调用SendData方法,该方法只有一个参数,就是要发送的数据。

f.GetData方法

当本地计算机接收到远程计算机的数据时,数据存放在缓冲区中,要从缓冲区中取出数据,可以使用GetData方法。GetData方法调用规范如下:

GetData data,[type,][maxLen]

它从缓冲区中取得最长为maxLen的数据,并以type类型存放在data中,GetData取得数据后,就把相应的缓冲区清空。

g.PeekData方法

和GetData方法类似,但PeekData在取得数据后并不把缓冲区清空。

3.Winsock控件主要

a.ConnectRequest

当本地计算机接收到远程计算机发送的连接请求时,控件的ConnectRequest将会被触发。

b.SendProgress

当一端的计算机正在向另一端的计算机发送数据时,SendProgress将被触发。SendProgress记录了当前状态下已发送的字节数和剩余字节数。

c.SendComplete

当所有数据发送完成时,被触发。

d.DataArrival

当建立连接后,接受到了新数据就会触发这个。注意:如果在接受到新数据前,缓冲区中非空,就不会触发这个。

e.Error

当在工作中发生任何错误都会触发这个。

例子见附件

三,WinSockAPI的使用

1.WSAStartup 函数

为了在你的应用程序当中调用任何一个Winsock API 函数,首先第一件事情你就是必须通过WSAStartup函数完成对Winsock 服务的初始化,因此需要调用WSAStartup函数。

Declare Function WSAStartup Lib "ws2_32.dll" _

(ByVal wVersionRequired As Long, lpWSAData As WSAData) As Long

这个函数有两个参数: wVersionRequired 和 lpWSAData。wVersionRequired 参数定义Windows Sockets 提供能使用的最高版本,它的高位字节定义的是次版本号,低位字节定义的是主版本号。下面的2个Winsock版本在VB中使用的例子:

初始化1.1版本

lngRetVal = WSAStartup(&H101, udtWinsockData)

初始化2.2版本

lngRetVal = WSAStartup(&H202, udtWinsockData)

第二个参数是WSADATA 的数据结构 ,它是接收Windows Sockets 执行时的数据。

Type WSAData

wVersion As Integer

wHighVersion As Integer

szDescription As String * WSADESCRIPTION_LEN

szSystemStatus As String * WSASYS_STATUS_LEN

iMaxSockets As Integer

iMaxUdpDg As Integer

lpVendorInfo As Long

End Type

数据成员的描述在下表中:

Field 描述

wVersion Windows Sockets 版本信息。

wHighVersion 通过加载库文件得到的最高的支持Winsock 的版本,

它通常和wVersion值相同。

szDescription Windows Sockets 执行时的详细描述

szSystemStatus 包含了相关的状态和配置的信息

iMaxSockets 表示同时打开的socket最大数,为0表示没有限制。

iMaxUdpDg 表示同时打开的数据报最大数,为0表示没有限制。

lpVendorInfo 厂商指定信息预留

在Winsock的1.1和2.2版本中没有lpVendorInfo的返回值。因为winsock 2支持多个传输协议,所以iMaxSockets 和iMaxUdpDg只能在仅支持TCP/TP的winsock1.1中使用。为了在Winsock 2中获得这些值,你可以使用WSAEnumProtocols 函数。

如果成功或者返回一个错误代码,则函数返回 0。

错误代码 含义

WSASYSNOTREADY 指出网络没有为传输准备好。

WSAVERNOTSUPPORTED 当前的WinSock实现不支持应用程序指定的Windows Sockets规范版本

WSAEINPROGRESS 一个阻塞WinSock调用正在进行

WSAEPROCLIM 请求的协议没有在系统中配置或没有支持它的实现存在。

WSAEFAULT lpWSAData 不是有效的指针

2.WSACleanup 函数

每次调用了WSAStartup函数,你都需要调用WSACleanup函数,通知系统来卸载库文件及清除已分配的,这个函数十分简单,没有任何参数:

Declare Function WSACleanup Lib "ws2_32.dll" () As Long

3.建立Socket函数

Declare Function socket Lib "ws2_32.dll" (ByVal af As Long, _

ByVal s_type As Long,

ByVal Protocol As Long) As Long

函数有3个参数定义建立何种socket,三个参数分别是:

Argument Description Enum Type

af Address family specification. AddressFamily

s_type Type specification for the new socket. SocketType

Protocol Protocol to be used with the socket SocketProtocol

that is specific to the indicated address

family.

AddressFamily:

AF_UNSPEC = 0 '/* unspecified */

AF_UNIX = 1 '/* local to host (pipes, portals) */

AF_INET = 2 '/* internetwork: UDP, TCP, etc. */

AF_IMPLINK = 3 '/* arpanet imp addresses */

AF_PUP = 4 '/* pup protocols: e.g. BSP */

AF_CHAOS = 5 '/* mit CHAOS protocols */

AF_NS = 6 '/* XEROX NS protocols */

AF_IPX = AF_NS '/* IPX protocols: IPX, SPX, etc. */

AF_ISO = 7 '/* ISO protocols */

AF_OSI = AF_ISO '/* OSI is ISO */

AF_ECMA = 8 '/* european computer manufacturers */

AF_DATAKIT = 9 '/* datakit protocols */

AF_CCITT = 10 '/* CCITT protocols, X.25 etc */

AF_SNA = 11 '/* IBM SNA */

AF_DECnet = 12 '/* DECnet */

AF_DLI = 13 '/* Direct data link interface */

AF_LAT = 14 '/* LAT */

AF_HYLINK = 15 '/* NSC Hyperchannel */

AF_APPLETALK = 16 '/* AppleTalk */

AF_NETBIOS = 17 '/* NetBios-style addresses */

AF_VOICEVIEW = 18 '/* VoiceView */

AF_FIREFOX = 19 '/* Protocols from Firefox */

AF_UNKNOWN1 = 20 '/* Somebody is using this! */

AF_BAN = 21 '/* Banyan */

AF_ATM = 22 '/* Native ATM Services */

AF_INET6 = 23 '/* Internetwork Version 6 */

AF_CLUSTER = 24 '/* Microsoft Wolfpack */

AF_12844 = 25 '/* IEEE 1284.4 WG AF */

AF_MAX = 26

Socket types:

SOCK_STREAM = 1 ' /* stream socket */

SOCK_DGRAM = 2 ' /* datagram socket */

SOCK_RAW = 3 ' /* raw-protocol interface */

SOCK_RDM = 4 ' /* reliably-delivered message */

SOCK_SEQPACKET = 5 ' /* sequenced packet stream */

Protocols:

IPPROTO_IP = 0 '/* dummy for IP */

IPPROTO_ICMP = 1 '/* control message protocol */

IPPROTO_IGMP = 2 '/* internet group management protocol */

IPPROTO_GGP = 3 '/* gateway^2 (deprecated) */

IPPROTO_TCP = 6 '/* tcp */

IPPROTO_PUP = 12 '/* pup */

IPPROTO_UDP = 17 '/* user datagram protocol */

IPPROTO_IDP = 22 '/* xns idp */

IPPROTO_ND = 77 '/* UNOFFICIAL net disk proto */

IPPROTO_RAW = 255 '/* raw IP packet */

IPPROTO_MAX = 256

该函数可以建立使用特定协议的网络套接字,例如对于UDP协议可以这样写:

s=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)

s=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)

4.关闭Socket函数

Declare Function closesocket Lib "ws2_32.dll" (ByVal s As Long) As Long

函数有一个参数为建立socket时的Handle

5.连接函数

Declare Function connect Lib "ws2_32.dll" (ByVal s As Long, _

ByRef name As sockaddr_in, _

ByVal namelen As Long) As Long

参数

s 连接的socket句柄。

name 建立连接的地址。

namelen 连接地址的长度。

返回值

成功时返回0。否则返回SOCKET_ERROR以及一个对应的错误号 Err.LastDllError。

显然在调用这个函数时我们需要知道socket句柄,将连接的电脑的端口号和主机名称(或主机IP地址)。我们知道Winsock 控件的Connect方法依靠两个变量:RemoteHost 和RemotePort。此方法不需要socket句柄,因其已经被封装在COM对象中。你也许认为connect函数应该也接受相同的变量设置,然而,事实并非如此。connect函数的主机地址和端口号的传送是依靠 sockaddr_in 结构。

Public Type sockaddr_in

sin_family As Integer

sin_port As Integer

sin_addr As Long

sin_zero(1 To 8) As Byte

End Type

6.套接字帮定函数

Declare Function bind Lib "ws2_32.dll" (ByVal s As Long, _

ByRef name As sockaddr_in, _

ByRef namelen As Long) As Long

s是使用Socket函数创建好的套接字,name指向描述通信对象的结构体的指针,namelen是该结构的长度。该结

构体中的分量包括:

IP地址:对应name.sin_addr.s_addr

端口号:对应name.sin_port

端口号用于表示同一台计算机上不同的进程(即应用程序),其分配方法有两种:

第一种分配方法是,进程让系统为套接字自动分配一端口号,这只要在调用bind前将端口号指定为0即可。由系统自动分配的端口号位于~5000之间,而1~1023之间的任一TCP或UDP端口都是保留的,系统不允许任一进程使用保留端口,除非其有效用户ID是零(即超级用户)。

第二种分配方法是,进程为套接字指定一特定端口。这对于需要给套接字分配一众所周知的端口的服务器是很有用的。指定范围在~65536之间。

地址类型:对应name.sin_family,一般都赋成AF_INET,表示是internet地址(即IP 地址)。IP地址通常使用点分表示法表示,但它事实上一个32位的长整数,这两者之间可通过inet_addr()函数转换。

7.套接字监听函数

Declare Function listen Lib "ws2_32.dll" (ByVal s As Long, ByVal backlog As Long) As Long

listen函数用来设定Socket为监听状态,这种状态表明Socket准备被连接了。注意,此函数一般在服务程序上使用,其中s是使用Socket函数创建好的套接字,backlog参数用于设定等待连接的客户端数。

8.接受连接请求

Declare Function accept Lib "ws2_32.dll" (ByVal s As Long, ByRef addr As sockaddr_in, _

ByRef addrlen As Long) As Long

服务端应用程序调用此函数来接受客户端Socket连接请求,accept()函数的返回值为一新的Socket,新Socket就可用来完成服务端和客户端之间的信息传递与接收,而原来Socket仍可以接受其他可户端的连接请求。

9.接收信息

Declare Function recv Lib "ws2_32.dll" (ByVal s As Long, _

ByRef buf As Any, _

ByVal buflen As Long, _

ByVal flags As Long) As Long

s 一个已连接的socket的识别符

buf 接受到的数据的缓冲区

len 缓冲区长度

flags 指定从哪调用的标识

第一个参数是socket的句柄-为socket函数返回值。那就是说:我们需要告诉recv函数,哪一个socket正访问函数。

第二个参数是:函数执行之后能装载一些数据的缓冲区。但它不是必须要有足够的长度接收Winsock缓冲区的所有数据,缓冲区的大小限制为8192 字节 (8 Kbytes)。因此如果Winsock缓冲区的数据的大小大于recv函数的缓冲区,你必需多次调用此函数,直到获取所有的数据。

如果应用程序定义缓冲区的长度,则recv函数必须知道缓冲区可以存放多少字节。第三个参数就是为了这个目的。

最后一个参数是可选的,今天我们不使用。该参数有两个选择标志: MSG_PEEK 和 MSG_OOB,用于改变函数的行为。

MSG_PEEK 从输入数据中取数。数据拷入缓冲区,但不从输入队列中移走。函数返回当前准备接收的字节数。

MSG_OOB 处理OOB(Out-of-band带外)数据。在网络上有两种类型的数据包,正常包和带外包。带外包可以通过检验一个TCP/IP包头的一个特定标志来决定。

10.发送信息

Declare Function send Lib "ws2_32.dll" (ByVal s As Long, _

ByRef buf As Any, _

ByVal buflen As Long, _

ByVal flags As Long) As Long

参数参看接收信息

四,服务器与客户机交互

目前最常用的方法是:服务程序在一个众所周知的地址(其中包括端口信息)监听对服务的请求,也就是说,服务进程一直处于休眠状态,直到一个客户对这个服务的地址提出了连接请求。这个时刻,服务程序被唤醒并对客户的请求作出适当的反应。注意,服务器与客户机之间的交互可以是面向连接的(基于流套接字),也可以是无连接的(基于数据报套接字)。

服务器

socket()

|

bind()

|

listen() 客户机

|

| socket()

| 建立连接 |

accept() <------------------------- connect()

| 请求数据 |

recv() <----------------------------- send()

| |

处理服务请求 |

| 应答数据 |

send() ------------------------------> recv()

| |

close() close()

五,其他

比较:WinSock控件

优点:使用简单,工作量小。

缺点:功能少仅支持TCP,UDP协议,需要WinSock控件(系统默认安装不带MSWINSCK.OCX文件)

适合于初学者

WinSockAPI

优点:功能强大,支持多种协议,使用灵.活,WinSockAPI调用的wsock32.dll(28K)或ws2_32.dll(69K)为Windows系统自带函数库不必担心缺少文件。

缺点:使用复杂,编程量大,需要一定基础

适合于要求较高的网络程序.

热门文章