winsock学习笔记(一)

PS:这几篇学习笔记都是在windows dev center上学习的东西,大部分是翻译。传送门:http://msdn.microsoft.com/en-us/library/windows/desktop/ms738545(v=vs.85).aspx#winsock.advanced_winsock_samples

1、winsock粗略介绍
winsock是windows平台下为网络套接字提供的一套标准。截图是winsock2的结构图:


在windows下,ws2_32.dll是Windows Sockets应用程序接口, 用于支持Internet和网络应用程序。因为ws2_32.dll需要在各种协议栈中通用,winsock的windows sockets2 Transport SPI接口使得ws2_32.dll不必关心下面一层的协议栈是什么,SPI为其归一了接口规范。而对上,winsock的windows sockets2 API接口又为实现winsock应用提供了接口。

2、服务端和客户端
socket网络应用的两种类型分别是服务端和客户端,创建的过程不一样,下面是他们的创建流程。
服务端:
  • Initialize Winsock.(初始化winsock)
  • Create a socket.(创建套接字)
  • Bind the socket.(绑定套接字)
  • Listen on the socket for a client.(监听套接字,等待客户端连接)
  • Accept a connection from a client.(接受客户端连接)
  • Receive and send data.(接受和发送数据或消息)
  • Disconnect.(断开连接)
客户端:
  • Initialize Winsock.(初始化winsock)
  • Create a socket.(创建套接字)
  • Connect to the server.(连接至服务端)
  • Send and receive data.(发送和接受数据或消息)
  • Disconnect.(断开连接)

3、使用与代码示例
     3.1、创建一个基础的winsock应用
     这一小节讲的是创建一个winsock应用时所应该include近来的头文件和链接库。代码如下:

C++:
#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif

#include <windows.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <iphlpapi.h>
#include <stdio.h>

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

int main() {
  return 0;
}

其中:
winsock2.h包含了winsock的APIs,包括各种函数,数据结构和变量定义;
ws2tcpip.h包含了Winsock 2 Protocol-Specific Annex文档里定义的为TCP/IP所使用的一些更新的函数和数据结构的定义;
iphlpapi.h包含了你所要使用的IP Helper的APIs的声明(这个头文件是可选的,但是如何有引用近来,就一定要放在引用winsock2.h那一行的后面);
#pragma comment(lib, "Ws2_32.lib")是在代码中写死让程序静态的去链接这个库,也可以通过IDE设置路径动态找到所需要的库;
前面三行宏定义的意思是,如果程序会引入winsock.h文件,则忽略这个文件,不让引入。这是因为由于历史原因windows.h文件中包含了为Windows Sockets 1.1版本所涉及的winsock.h文件,从而使得有些定义会跟为Windows Sockets 2.0设计的winsock2.h中的一些定义冲突,使用这个宏的话可以禁止winsock.h文件的引入,解决这样的冲突。

     3.2、初始化Winsock
     所有要调用其他winsock函数的应用或者dll都必须先初始化windows sockets DLL。使用的是WSAStartup函数。如下代码:
WSADATA wsaData;

int iResult;
// Initialize Winsock
iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
if (iResult != 0) {
    printf("WSAStartup failed: %d\n", iResult);
    return 1;
}

其中,对于WSAStartup函数:
第一个参数是调用都想要使用的版本号,是一个WORD类型的变量。这个变量的高字节指定了次版本号,低字节指定了主版本号,两个字节加到一起,就是你想要的Winsock库的版本号了。上述代码中的版本就是2.2。也可以直接用0X0202代替上面的MAKEWORD(2, 2);

第二个参数wsaData是一个WSADATA类型的数据结构实例,用于存储初始化winsock之后返回的信息,这些信息包括版本号,监听队列的大小,你能创建的最多的socket数目等。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
《Windows Sockets网络编程》是WindowsSockets网络编程领域公认的经典著作,由Windows Sockets2.0规范解释小组负责人亲自执笔,权威性毋庸置疑。它结合大量示例,对WindowsSockets规范进行了深刻地解读,系统讲解了WindowsSockets网络编程及其相关的概念、原理、主要命令、操作模式,以及开发技巧和可能的陷阱,从程序员的角度给出了大量的建议和最佳实践,是学习WindowsSockets网络编程不可多得的参考书。   全书分为三部分:第一部分(第1~6章),提供了翔实的背景知识和框架方面的概念,借助于此框架,读者可理解WinSock的具体细节,包括WindowsSockets概述、OSI网络参考模型、TCP/IP协议簇中的协议和可用的服务、WinSock网络应用程序的框架及其工作机制、WinSock的三种操作模式、socket通信机制等;第二部分(第7~12章),以FTP客户端实例为基础介绍了函数实例库,还介绍了客户端程序、服务器程序和DLL中间构件及它们的相应函数,并涵盖socket命令和选项及移植BSDSockets相关事项等;第三部分(第13~17章),介绍了应用程序调试技术和工具,针对应用编程中的陷阱的建议和措施,WinSockAPI的多种操作系统平台,WinSock规范的可选功能和WinSock规范2.0中的所有新功能。 译者序 序 前言 第1章 Windows Sockets概述 1.1 什么是Windows Sockets 1.2 Windows Sockets的发展历史 1.3 Windows Sockets的优势 1.3.1 Windows Sockets是一个开放的标准 1.3.2 Windows Sockets提供源代码可移植性 1.3.3 Windows Sockets支持动态链接 1.3.4 Windows Sockets的优点 1.4 Windows Sockets的前景 1.5 结论 第2章 Windows Sockets的概念 2.1 OSI网络模型 2.2 WinSock网络模型 2.2.1 信息与数据 2.2.2 应用协议 2.3 WinSock中的OSI层次 2.3.1 应用层 2.3.2 表示层 2.3.3 会话层 2.3.4 传输层 2.3.5 网络层 2.3.6 数据链路层 2.3.7 物理层 2.4 模块化的层次框 2.5 服务和协议 2.6 协议和API 第3章 TCP/IP协议服务 3.1 什么是TCP/IP 3.2 TCP/IP的发展历史 3.3 传输服务 3.3.1 无连接的服务:UDP 3.3.2 面向连接的服务:TCP 3.3.3 传输协议的选择:UDP与TCP的对比 3.4 网络服务 3.4.1 IP服务 3.4.2 ICMP服务 3.5 支持协议和服务 3.5.1 域名服务 3.5.2 地址解析协议 3.5.3 其他支持协议 3.6 TCP/IP的发展前景 第4章 网络应用程序工作机制 4.1 客户端-服务器模型 4.2 网络程序概览 4.3 socket的打开 4.4 socket的命名 4.4.1 sockaddr结构 4.4.2 sockaddr_in结构 4.4.3 端口号 4.4.4 本地IP地址 4.4.5 什么是socket名称 4.4.6 客户端socket名称是可选的 4.5 与另一个socket建立关联 4.5.1 服务器如何准备建立关联 4.5.2 客户端如何发起一个关联 4.5.3 服务器如何完成一个关联 4.6 socket之间的发送与接收 4.6.1 在“已连接的”socket上发送数据 4.6.2 在“无连接的”socket上发送数据 4.6.3 接收数据 4.6.4 socket解复用器中的关联 4.7 socket的关闭 4.7.1 closesocket 4.7.2 shutdown 4.8 客户端和服务器概览 第5章 操作模式 5.1 什么是操作模式 5.1.1 不挂机,等待:阻塞 5.1.2 挂机后再拨:非阻塞 5.1.3 请求对方回拨:异步 5.2 阻塞模式 5.2.1 阻塞socket 5.2.2 阻塞函数 5.2.3 伪阻塞的问题 5.2.4 阻塞钩子函数 5.2.5 阻塞情境 5.2.6 撤销阻塞操作 5.2.7 阻塞操作中的超时 5.2.8 无最少接收限制值 5.2.9 代码示例 5.3 非阻塞模式 5.3.1 怎样使socket成为非阻塞的 5.3.2 成功与失败不是绝对的 5.3.3 探询而非阻塞 5.3.4 显式地避让 5.3.5 代码示例 5.4 异步模式 5.4.1 认识异步函数 5.4.2 撤销异步操作 5.4.3 代码示例 5.4.4 AU_T
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值