Winsock API
Abstracted from MSDN
网络字节顺序/主机字节顺序 (IP address, Port) |
|||
Function |
Parameter |
Return Value |
|
unsigned long inet_addr( __in const char* cp ); |
const char* cp |
点分法IP地址字符串 |
SUCCEED: unsigned long类型的网络字节顺序格式IP地址. FAIL: INADDR_NONE: cp不是有效的IP地址字符串 |
Remarks: |
|||
1. 功能: 点分法IP地址字符串 à 网络字节顺序(struct in_addr)IP地址 |
|||
char* FAR inet_ntoa( __in struct in_addr in );
(Net TO Asci) |
struct in_addr in |
网络字节顺序(struct in_addr)IP地址 |
SUCCEED: 点分法IP地址字符串. FAIL: NULL |
Related Struct: |
|||
用来保存网络字节顺序格式的IP地址 |
typedef 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; } IN_ADDR, *PIN_ADDR, FAR *LPIN_ADDR; |
||
Remarks: |
|||
1. 功能: 网络字节顺序(struct in_addr)IP地址 à 点分法IP地址字符串 |
|||
u_long htonl( __in u_long hostlong );
(Host TO Net Long) |
u_long hostlong |
主机字节顺序的u_long 值 |
SUCCEED: 网络字节顺序的u_long FAIL: N/A |
Remarks: |
|||
1. 功能: 主机字节顺序的u_long (32-bit) à 网络字节顺序的u_long (32-bit) |
|||
u_short htons( __in u_short hostshort );
(Host TO Net Short) |
u_short hostshort |
主机字节顺序的u_short值 |
SUCCEED: 网络字节顺序的u_short FAIL: N/A |
Remarks: |
|||
1. 功能: 主机字节顺序的u_short (16-bit) à 网络字节顺序的u_short (16-bit) |
|||
u_long ntohl( __in u_long netlong );
(Net TO Host Long) |
u_long netlong |
网络字节顺序的u_long值 |
SUCCEED: 主机字节顺序的u_long FAIL: N/A |
Remarks: |
|||
1. 功能: 网络字节顺序的u_long (32-bit)à 主机字节顺序的u_long (32-bit) |
|||
u_short ntohs( __in u_short netshort );
(Net TO Host Short) |
u_short netshort |
网络字节顺序的u_short值 |
SUCCEED: 主机字节顺序的u_long FAIL: N/A |
Remarks: |
|||
1. 功能: 网络字节顺序的u_short (16-bit)à 主机字节顺序的u_short (16-bit) |
TCP(面向连接的socket) |
|||||
Function |
Parameter |
Return Value |
|||
SOCKET socket( __in int af, __in int type, __in int protocol ); |
int af |
指定协议的地址家族. AF_INET: for IPv4; AF_INET6: for IPv6. |
SUCCEED: 返回新创建的socket句柄 FAIL: INVALID_SOCKET |
||
int type |
指定套接字的类型. SOCK_STREAM(1): for TCP; SOCK_DGRAM(2): for UDP; SOCK_RAW(3): 原始套接字,可用来操纵下层协议(IP)的头. |
||||
int protocol |
指定套接字使用的协议. IPPROTO_TCP(6): when type is SOCK_STREAM. IPPROTO_UDP(17): when type is SOCK_DGRAM. |
||||
Remarks: N/A |
|||||
int bind( __in SOCKET s, __in const struct sockaddr* name, __in int namelen ); |
SOCKET s |
标识一个未绑定的socket句柄. |
SUCCEED: 0 FAIL: SOCKET_ERROR |
||
const struct sockaddr* name |
绑定到s的struct sockaddr地址. |
||||
int namelen |
参数name长度 |
||||
Related Struct: |
|||||
通用的socket地址 |
struct sockaddr { ushort sa_family; char sa_data[14]; }; WindowsVista及以后, sockaddr 被typedef为SOCKADDR: typedef struct sockaddr { #if (_WIN32_WINNT < 0x0600) u_short sa_family; #else ADDRESS_FAMILY sa_family; #endif //(_WIN32_WINNT < 0x0600) CHAR sa_data[14]; } SOCKADDR, *PSOCKADDR, FAR *LPSOCKADDR; |
||||
internet环境下套接字的地址形式 |
struct sockaddr_in { short sin_family; u_short sin_port; struct in_addr sin_addr; char sin_zero[8]; }; WindowsVista及以后, sockaddr_in被typedef为SOCKADDR_IN: typedef struct sockaddr_in { #if(_WIN32_WINNT < 0x0600) short sin_family; #else //(_WIN32_WINNT < 0x0600) ADDRESS_FAMILY sin_family; #endif //(_WIN32_WINNT < 0x0600) USHORT sin_port; IN_ADDR sin_addr; CHAR sin_zero[8]; } SOCKADDR_IN, *PSOCKADDR_IN; |
||||
Remarks: |
|||||
1. 作用: 当socket句柄被创建后, 它就存在于一个命名空间内 (address family), 但没有给它指定名字. 通过bind函数, 指定一个名字与socket关联起来. 2. sockaddr与sockaddr_in sockaddr是通用的socket地址, sockaddr_in是internet环境下套接字的地址形式. 填值的时候使用sockaddr_in结构, 而作为函数(如socket, listen, bind等) 的参数传入的时候转换成sockaddr结构, 因为二者都是16个字节长度. 3. struct sockaddr_in的组成部分: (1) sin_family: 地址家族. AF_INET for IPv4 (2) sin_port: 端口. If sin_port=0, 服务提供者会分配一个1024-5000之间的端口值. If指定端口: sin_port = htons(27015). htons将端口值转为网络字节顺序格式 (3) sin_addr: 主机地址, struct in_addr类型,网络字节顺序格式的IP地址. If sin_addr=ADDR_ANY, 服务提供者指定该socket和0.0.0.0绑定. If指定地址:sin_addr= inet_addr("127.0.0.1"); |
|||||
int listen( __in SOCKET s, __in int backlog ); |
SOCKET s |
指定一个已经绑定但尚未连接的socket. |
SUCCEED: 0 FAIL: SOCKET_ERROR |
||
int backlog |
指定等待连接队列的最大长度
|
||||
Remarks: |
|||||
SOCKET accept( __in SOCKET s, __out struct sockaddr* addr, __in_out int* addrlen ); |
SOCKET s |
已设置为监听状态的socket |
SUCCEED: 返回一个新建的socket句柄 FAIL: INVALID_SOCKET |
||
struct sockaddr* addr |
用于接收新建立的socket的地址信息. 可选参数,可设为NULL. |
||||
int* addrlen |
指定参数 addr的长度. 可选参数,可设为NULL. |
||||
Remarks: N/A |
|||||
int send( __in SOCKET s, __in const char* buf, __in int len, __in int flags ); |
SOCKET s |
已连接的socket |
SUCCEED: 返回发送数据的字节数,可能小于len中指定的数据长度. FAIL: SOCKET_ERROR |
||
const char* buf |
要发送数据的缓冲区 |
||||
int len |
buf长度 |
||||
int flags |
指定函数调用方式: 0: 指明该函数无特殊行为. DONTROUTE: 指定传输层不要将数据路由出去. MSG_OOB: 从带外 (Out of Band) 发送数据. |
||||
Remarks: |
|||||
1. 允许发送len=0的数据, 此时send返回0 |
|||||
int recv( __in SOCKET s, __out char* buf, __in int len, __in int flags ); |
SOCKET s |
已连接的socket |
SUCCEED: 返回接收到的数据的字节数. 返回0:连接已经关闭. FAIL: SOCKET_ERROR |
||
char* buf |
用于接收数据的缓冲区 |
||||
int len |
buf长度 |
||||
int flags |
指定函数调用方式: 0: 一般设为0,指明该函数无特殊行为. MSG_PEEK: 复制数据到缓冲区buf,但并不从输入队列中移除这些数据. MSG_OOB: 处理带外数据 MSG_WAITALL: recv返回一直阻塞,直到指定的条件满足时,或者是发生了错误 |
||||
Remarks: N/A |
|||||
int shutdown( __in SOCKET s, __in int how ); |
SOCKET s |
指定要禁用的socket. |
SUCCEED: 0 FAIL: SOCKET_ERROR |
||
int how |
指定禁用的操作: SD_RECEIVE: 不允许该socket再次recv. SD_SEND: 不允许该socket再次send SD_RECEIVE: 不允许该socket再次recv和send. |
||||
Remarks: |
|||||
1. 不再允许在socket上发送或接收数据 2. shutdown不会关闭socket. 在closesocket之前,所有与该socket相关的资源都不会被释放. 3. 断开与socket连接的方式: (1)Graceful Disconnect: 先shutdown禁用socket, 再closesocket关闭连接. (2)Abortive Disconnect: 系统会将没有发送的数据丢弃, 直接closetsocket. |
|||||
int closesocket( __in SOCKET s ); |
SOCKET s |
指定要关闭的socket. |
SUCCEED: 0 FAIL: SOCKET_ERROR |
||
Remarks: N/A |
|||||
int connect( __in SOCKET s, __in const struct sockaddr* name, __in int namelen ); |
SOCKET s |
指定一个未连接的socket |
SUCCEED: 0 FAIL: SOCKET_ERROR |
||
const struct sockaddr* name |
指定要建立连接的socket name. |
||||
int namelen |
指定name length. |
||||
Remarks: N/A |
|||||
C/S模式通信过程 |
|||||
Server |
Client |
||||
1.初始化winsocket |
WSAStartup |
1.初始化winsocket |
WSAStartup |
||
2.建立socket |
socket |
2.建立socket |
socket |
||
3.与本机进行邦定 |
bind |
N/A |
|
||
4.开始监听 |
listen |
N/A |
|
||
5.接受客户端的连接请求 |
accept |
3.与服务器进行连接 |
connect |
||
6.与客户端进行通信 |
recv/send |
4.与服务器进行通信 |
send/recv |
||
7.通信完成, 关闭连接 |
shutdown, closesocket |
5.通信完成, 关闭连接 |
closesocket |
||
8.释放winsocket有关资源 |
WSACleanup |
6.释放winsocket占用的资源 |
WSACleanup |
||
UDP(面向非连接的socket) |
||||||
Function |
Parameter |
Return Value |
||||
int sendto( __in SOCKET s, __in const char* buf, __in int len, __in int flags, __in const struct sockaddr* to, __in int tolen ); |
SOCKET s |
已连接的socket |
SUCCEED: 返回发送数据的字节数. FAIL: SOCKET_ERROR |
|||
const char* buf |
要发送数据的缓冲区 |
|||||
int len |
buf长度 |
|||||
int flags |
指定函数调用方式: 0: 指明该函数无特殊行为. DONTROUTE: 指定传输层不要将数据路由出去. MSG_OOB: 从带外 (Out of Band) 发送数据. |
|||||
const struct sockaddr* to |
指定接收数据的目的地址 |
|||||
in int tolen |
to长度 |
|||||
Remarks: N/A |
||||||
int recvfrom( __in SOCKET s, __out char* buf, __in int len, __in int flags, __out struct sockaddr* from, __in_out int* fromlen ); |
SOCKET s |
已连接的socket |
SUCCEED: 返回接收到的数据的字节数. 返回0:连接已经关闭. FAIL: SOCKET_ERROR |
|||
char* buf |
用于接收数据的缓冲区 |
|||||
int len |
buf长度 |
|||||
int flags |
指定函数调用方式: 0: 指明该函数无特殊行为. MSG_PEEK: 复制数据到缓冲区buf, 但并不从输入队列中移除这些数据. MSG_OOB:带外处理数据 |
|||||
struct sockaddr* from |
指定发送数据的主机地址 |
|||||
int* fromlen |
from长度 |
|||||
Remarks: N/A |
||||||
C/S模式通信过程 |
||||||
Server |
Client |
|||||
1.初始化winsocket |
WSAStartup |
1.初始化winsocket |
WSAStartup |
|||
2.建立socket |
socket |
2.建立socket |
socket |
|||
3.与本机进行邦定 |
bind |
3.与本机进行邦定 |
bind |
|||
4.与客户端进行通信 |
recvfrom/sendto |
4.与服务器进行通信 |
sendto |
|||
5.通信完成, 关闭连接 |
closesocket |
5.通信完成, 关闭连接 |
closesocket |
|||
6.释放winsocket有关资源 |
WSACleanup |
6.释放winsocket占用的资源 |
WSACleanup |
|||
SOCKET选项操作 |
|||
Function |
Parameter |
Return Value |
|
int setsockopt( __in SOCKET s, __in int level, __in int optname, __in const char* optval, __in int optlen );
|
SOCKET s |
socket |
SUCCEED: 0. FAIL: SOCKET_ERROR |
int level |
选项级别: SOL_SOCKET IPPROTO_TCP |
||
int optname |
socket选项名称 |
||
const char* optval |
设置socket选项名称的值数据的缓冲区 |
||
int optlen |
optval长度 |
||
Remarks: N/A |
|||
int getsockopt( __in SOCKET s, __in int level, __in int optname, __out char* optval, __in_out int* optlen );
|
SOCKET s |
socket |
SUCCEED: 0. FAIL: SOCKET_ERROR |
int level |
选项级别: SOL_SOCKET IPPROTO_TCP |
||
int optname |
socket选项名称 |
||
char* optval |
接收socket选项名称的值数据的缓冲区 |
||
int* optlen |
optval长度 |
||
Remarks: N/A |
getaddrinfo
provides protocol-independent translation from an ANSI host name to an address.
*gethostbyname
retrieves host information corresponding to a host name from a host database.
Note The gethostbyname function has been deprecated by the introduction of the getaddrinfo function. Developers creating Windows Sockets 2 applications are urged to use the getaddrinfo function instead of gethostbyname.
gethostbyaddr
retrieves the host information corresponding to a network address.
Note The gethostbyaddr function has been deprecated by the introduction of the getnameinfo function. Developers creating Windows Sockets 2 applications are urged to use the getnameinfo function instead of gethostbyaddr.