网络编程-Winsock (一)

2014-11-24 01:44:17 · 作者: · 浏览: 8

Windows下的网络应用开发大部分是通过Winsock完成的(除了Winsock 以外还有其他的),Winsock有两种开发模式,一种是阻塞模式,另一种是非阻塞模式。阻塞模式是基本同步的开发模式,非阻塞模式是基于异步的开发模式。非阻塞模式结合了Windows的消息机制,更符合Windows下的开发。

Winsock的相关函数
每个需要使用Winsock进行网络开发的Widnows 应用程序都必须包含Winsock2.h(这是的二个版本的Winsock库),除了这个以外,还有一个静态库ws2_32.lib 。在使用它们的时候要对这个库进行一次初始化,使用完毕之后要释放该库,下面分别介绍这两个函数。

首先来看初始化 ws2_32.dll 动态链接库的函数:

[cpp] int WSAStartup(
WORD wVersionRequested,
LPWSADATA lpWSAData
);

int WSAStartup(
WORD wVersionRequested,
LPWSADATA lpWSAData
); 这个函数是用来初始化 ws2_32.dll动态链接库的,这个动态链接库是所有网络应用程序都会加载的动态链接库,在使用这个动态链接库时就需要用 WSAStartup() 函数进行初始化。如果不初始化这个动态链接库,其余相关的基于这个动态链接库的网络函数的调用都会失败。

参数说明如下:

(1)wVersionRequested : Windows Sockets API 提供的调用方可使用的最高版本号。高位字节指出副版本(修正)号,低位字节指出主版本号。

(2)lpWSAData : 指向 WSADATA 数据结构的的指针,用来接收 Windows sockets 实现的细节。

释放 ws2_32.dll 动态链接库:


[cpp] WSACleanup();//释放套接字库

WSACleanup();//释放套接字库 这个函数是结束这个动态链接库的,一般在程序退出时使用。

创建套接字:


[cpp] SOCKET socket(
int af,
int type,
int protocol
);

SOCKET socket(
int af,
int type,
int protocol
); 参数说明如下:

(1) af :指定应用程序使用的通信协议族,对于TCP/IP 协议族,该参数始终为 PF_INET 。也有一些使用的是 AF_INET。AF_INET 是地址族,虽然使用这个没错,但还是建议使用 PF_INET.

(2) type :指定要创建的套接字的类型,流套接字类型为 SOCK_STREAM, 数据包套接字类型为 SOCK_DGRAM。前者通常被TCP协议使用,后者通常是被UDP协议使用。

(3) protocal :指定应用程序所使用的通信协议。该参数根据第二个参数的不同而不同,第二个参数为 SOCK_STREAM,该参数为 IPPROTO_TCP ;如果第二个参数为 SOCK_DGRAM,那么该参数为 IPPROTO_UDP.

该函数的返回值是一个新创建的SOCKET 的套接字的描述符。

关闭套接字:


[cpp] int closesocket(
SOCKET s
);

int closesocket(
SOCKET s
);


程序结束时要对Socket创建的套接字进行关闭,完成资源的释放。

参数说明如下:

s :socket() 函数创建的套接字描述符。

当创建了一个Socket后,服务器必须要绑定一个IP地址和特定的端口号。客户程序不需要绑定端口号和IP地址,因为Socket会选择合适的IP地址和端口号来使用。

绑定IP地址和端口号:


[cpp] int bind(
SOCKET s,
const struct sockaddr FAR *name,
int namelen
);

int bind(
SOCKET s,
const struct sockaddr FAR *name,
int namelen
);


参数说明如下:

(1)s :指定待绑定的Socket描述符。

(2)name :指定一个sockaddr 结构,该结构的定义如下:


[cpp] struct sockaddr { u_short sa_family; char sa_data[14]; }; struct sockaddr {
u_short sa_family;
char sa_data[14];
};
函数中提供的参数类型是sockaddr,在实际使用过程中,结构体是 sockaddr_in ,该结构的定义如下:


[cpp] struct sockaddr_in{ short sin_family; unsigned short sin_port; struct in_addr sin_addr; char sin_zero[8]; }; struct sockaddr_in{
short sin_family;
unsigned short sin_port;
struct in_addr sin_addr;
char sin_zero[8];
};
成语变量sin_family 设置为PF_INET ;sin_port 设置为端口号;sin_addr 结构体中只包含一个公用体,in_addr的定义如下:


[cpp] struct in_addr { union { struct { u_char s_b1,s_b2,s_b3,s_b4; } S_un_b; struct { u_short s_w1,s_w2; } S_un_w; u_long S_addr; } S_un; }; struct in_addr {
union {
struct { u_char s_b1,s_b2,s_b3,s_b4; } S_un_b;
struct { u_short s_w1,s_w2; } S_un_w;
u_long