网络 API

库文件:WS2_32.dll

头文件:winsock2.h

函数名 描述
int WSAStartup(...) 加载套接字库, 并进行套接字的版本协商
WSAClearUp(...) 释放套接字 (仅成功加载后)
SOCKET socket(...) 创建套接字
int bind(...) 绑定本地 IP 地址和端口
int listen( SOCKET s, int backlog ) 启动监听模式,等待客户端连接
SOCKET accept(...) 接受客户端请求,并返回套接字
int send(...) 发送信息
int recv(...) 接收信息
int connect(...) 连接到服务器
int sendto(...) 发送信息(UDP 用)
int recvfrom(...) 接收信息报并保存源地址(UDP 用)
u_short htons( u_short hostshort ) 把 16 位数值从主机字节顺序转为 TCP/IP 网络字节顺序
u_long ntonl( u_long hostshort ) 把 32 位数值从主机字节顺序转为 TCP/IP 网络字节顺序
unsigned long inet_addr( const char FAR *p ) 字符串 IP 转为 u_long 形式
char FAR * inet_ntoa( struct in_addr in ) u_long 形式 IP 转为字符串
WSAGetLastError() 取得调用失败的信息

WSAStartup

int WSAStartup(WORD wVersionRequired, LPWSADATA lpWSAData);
参数 描述
wVersionRequired 希望采用的套接字版本, 低位主版本, 高位副版本. 参 MAKEWORD(h,l),LOBYTE(w), HIBYTE(w)
lpWSAData 指向 WSADATA 结构的指针, 输出套接字的有关信息
返回值 0 : 成功

WSASYSNOTREADY : 不能加载套接字库

WSAVERNOTSUPPORTED : 版本太低不支持

socket

SOCKET socket( int af, int type, int protocol )
参数 描述
af 地址族, TCP/IP 协议对应为 AF_INET
type Socket 类型, 1.1 版支持 SOCK_STREAM 流式套接字和 SOCK_DGRAM 数据报套接字
protocol 协议, 一般指定为 0 自动使用协议
返回值 成功返回 SOCKET 数据类型的套接字描述符

INVALID_SOCKET : 调用失败

bind

int bind( SOCKET s, const struct sockaddr FAR *name, int namelen )
参数 描述
s 套接字, 由 socket 函数返回
name 有关套接字本地地址信息的结构, 通常应与网络协议对应, 如 sockaddr, sockaddr_in 结构

注:绑定所有本地 IP 的方法:addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY)

namelen 上述结构的长度
返回值 0 : 绑定成功

SOCKET_ERROR : 绑定失败

listen

int listen( SOCKET s, int backlog )
参数 描述
s 套接字, 由 socket 函数返回
backlog 等待队伍长度,可设为 SOMAXCONN 使用最大合理值
返回值  

accept

SOCKET accept( SOCKET s, struct sockaddr FAR * addr, int FAR * addrlen )
参数 描述
s 套接字, 由 socket 函数返回,并已经启动监听
addr 客户端地址信息结构
addrlen 客户端地址信息结构长度
返回值 套接字,与指定客户对应,用于收发信息

send

int send( SOCKET s, const char FAR * buf, int len, int flags )
参数 描述
s 套接字, 由 accept 函数返回
buf 待发送数据
len 待发送数据长度
flags 一般设为 0
返回值  

recv

int recv( SOCKET s, char FAR *buf, int len, int flags)
参数 描述
s 套接字
buf 接收数据的缓冲区
len 接收数据的缓冲区大小
flags 一般设为 0
返回值  

connect

int connect(SOCKET s, const struct sockaddr FAR * name, int namelen)
参数 描述
s 套接字
name 服务器地址信息结构
namelen 服务器地址信息结构大小
返回值  

sendto

int sendto(SOCKET s,const char FAR * buf,int len,int flags,const struct sockaddr FAR * to,int tolen)
参数 描述
s 套接字
buf 等发送的数据
len 等发送的数据大小
flags 一般设为 0
to 指定接收地址信息的结构
tolen 上面地址信息结构的大小
返回值  

recvfrom

int recvfrom(SOCKET s,char FAR * buf,int len,int flags,struct sockaddr FAR * from,int FAR * fromlen)
参数 描述
s 套接字
buf 接收数据的缓冲区
len 接收数据的缓冲区大小
flags 一般设为 0
from 保存发送主地址信息的结构
fromlen 上面地址信息结构的大小(in/out)
返回值  

WSADATA 结构

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;
成员 描述
wVersion 采用的套接字版本
wHighVersion 系统现有套接字的最大版本
szDescription 未知
szSystemStatus 未知
iMaxSockets 同时最多可打开的套接字数, 勿更改
iMaxUdpDg 同时最多可打开的数据报数, 勿更改
lpVendorInfo 厂商预留信息, 未用

sockaddr 结构

struct sockaddr {
    u_short sa_family; /* address family */
    char sa_data[14]; /* up to 14 bytes of direct address */
};
成员 描述
sa_family 地址族, TCP/IP 协议对应为 AF_INET
sa_data 内存分配区, 具体信息按协议各不相同 (按网络字节顺序表示)

sockaddr_in 结构

在 TCP/IP 环境使用此结构比较方便。

struct sockaddr_in {
    short sin_family;
    u_short sin_port;
    struct in_addr sin_addr;
    char sin_zero[8];
};
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;
}
成员 描述
sin_family 地址族, TCP/IP 协议对应为 AF_INET
sin_port 端口(网络字节顺序 ,参见 htons 函数)
sin_addr IP 地址结构
sin_zero 未用,补充长度用
S_addr IP 地址 (网络字节顺序 ,参见 htonl 函数)

示例: