• 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.

     

     

  • 相关阅读:
    mac creact-react-app 时包 gyp-error
    JAVA,JDBC报错Access denied for user '"root"'@'localhost
    JAVA,JDBC连接数据库报错:No suitable driver found for "jdbc:mysql://localhost:3306
    JAVA,反射使用demo,通过读取配置文件创建类,调用方法
    JAVA,反射获取class对象的3种方式
    python获取当前时间距离指定时间相差的秒值
    JAVA,字节流文件读写
    JAVA,反射常用方法
    JAVA,字符流读写,flush和close的区别
    JAVA,字符流文件读写
  • 原文地址:https://www.cnblogs.com/zhcncn/p/2855012.html
Copyright © 2020-2023  润新知