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, 服务提供者指定该socket0.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:

1. listen函数中backlog参数的意义

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.

 

 

 

posted @ 2013-01-10 16:17  金石开  阅读(806)  评论(0编辑  收藏  举报