关于服务器和客户端
有两种不同类型的socket网络应用程序:服务器和客户端。
服务器和客户端有不同的行为;因此,创建他们的过程是不同的。以下是用于创建流的 TCP/IP 服务器和客户端的一般模型。
Server
- 初始化Winsock
- 创建socket
- 绑定(Bind)socket
- 在socket上侦听(Listen)客户端
- 接受(Accept)来自客户端的连接
- 接收(Receive)和发送(Send)数据
- 断开连接
Client
- 初始化Winsock
- 创建socket
- 连接(Connect)服务器
- 发送(Send)和 接收(Receive)数据
- 断开连接
注:服务器和客户端 上的一些步骤是相同的。这些步骤实施,几乎完全一样。本引导中的步骤将只限定此创建的应用程序。
创建一个基本的Winsock应用
1.新建一个空工程;
2.添加C++源文件到工程中;
3.保证编译环境能够找到 Microsoft Windows Software Development Kit (SDK) 和早期 Platform Software Development Kit (SDK)的Include, Lib, Src目录;
4.保证编译环境链接到Winsock库文件 Ws2_32.lib ,使用 #pragma comment 链接到 Ws2_32.lib;
5.开始编写Winsock应用程序
- 包含头文件 winsock2.h 使用 Winsock API,winsock2.h 包括了大部分的 Winsock 函数,结构体及定义
- 包含头文件 ws2tcpip.h ,其包含了Winsock2 的TCP/IP协议特定附件文件的定义
- 包含头文件 stdio.h,用于标准输入输出,特别是 printf() 函数
#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>
#pragma comment(lib, "Ws2_32.lib")
int main() {
return 0;
}
注意:
(1)如果要使用 IP Helper APIs,就需要包含 iphlpapi.h 文件,然后#include <winsock2.h> 需要编写在 #include <iphlpapi.h>前面;
(2)winsock2.h 内部包含了 windows.h 的核心元素,所以在Winsock应用中就不必包含windows.h;如果需要包含,就需要在前面定义 #define WIN32_LEAN_AND_MEAN 宏;
(3)历史原因,windows.h默认包含winsock.h(Windows Sockets 1.1),winsock.h 和 winsock2.h(Windows Sockets 2.0)会产生冲突,以上宏就是防止winsock.h被包含进windows.h。
#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;
}
初始化Winsock
所有需要调用Winsock中函数的程序,都必须在调用前来启动应用 Windows Sockets DLL
1.创建WSADATA 对象
<span style="font-size:18px;">WSADATA wsaData;</span>
2.调用WSAStartup,返回一整型,检查错误
int iResult;
// Initialize Winsock
iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
if (iResult != 0) {
printf("WSAStartup failed: %d\n", iResult);
return 1;
}
小结:
(1)WSAStartup函数用于启动应用WS2_32.dll;
(2)WSADATA结构体包括了Windows Sockets执行的信息;
(3)参数MAKEWORD(2,2) 是对Winsock2.2版本请求,设置以前版本作为最高版本支持调用
编辑于2016年8月2日 By Seefun_Zhu
|