• [置顶] UNIX学习之路 一步一个脚印之socket编程/Socket的参数


    1.创建Socket.

    注意不同的系统下参数不一定相同,这里列出了所有要求的参数可用值。

    另外注意不同的版本可以使用的参数也不相同,可以参考相关文档

    参数a.地址族(与TCP/IP协议下的协议族等价)可以使用的参数如下

    #define AF_UNIX         1               /* local to host (pipes, portals) */

    #define AF_INET         2               /* internetwork: UDP, TCP, etc. */

    #define AF_IMPLINK      3               /* arpanet imp addresses */

    #define AF_PUP          4               /* pup protocols: e.g. BSP */

    #define AF_CHAOS        5               /* mit CHAOS protocols */

    #define AF_NS           6               /* XEROX NS protocols */

    #define AF_IPX          AF_NS           /* IPX protocols: IPX, SPX, etc. */

    #define AF_ISO          7               /* ISO protocols */

    #define AF_OSI          AF_ISO          /* OSI is ISO */

    #define AF_ECMA         8               /* european computer manufacturers */

    #define AF_DATAKIT      9               /* datakit protocols */

    #define AF_CCITT        10              /* CCITT protocols, X.25 etc */

    #define AF_SNA          11              /* IBM SNA */

    #define AF_DECnet       12              /* DECnet */

    #define AF_DLI          13              /* Direct data link interface */

    #define AF_LAT          14              /* LAT */

    #define AF_HYLINK       15              /* NSC Hyperchannel */

    #define AF_APPLETALK    16              /* AppleTalk */

    #define AF_NETBIOS      17              /* NetBios-style addresses */

    #define AF_VOICEVIEW    18              /* VoiceView */

    #define AF_FIREFOX      19              /* Protocols from Firefox */

    #define AF_UNKNOWN1     20              /* Somebody is using this! */

    #define AF_BAN          21              /* Banyan */

    #define AF_ATM          22              /* Native ATM Services */

    #define AF_INET6        23              /* Internetwork Version 6 */

    #define AF_CLUSTER      24              /* Microsoft Wolfpack */

    #define AF_12844        25              /* IEEE 1284.4 WG AF */

    #define AF_MAX          26

    AF_UNIX //表示Unix内部协议

    AF_NS //表示使用的是Xerox NS协议族

    AF_IMPLINK//表示 IMP 连接层

    另外AF_LOCAL是用于Unix/Linux系统中本机进程间通信

     

    参数b.Socket类型

    可以取如下的一些值:

    SOCK_STREAM 流套接字

    SOCK_DGRAM 数据报套接字

    SOCK_RAW 未加工套接字(可以用它来接收原始的数据包,即不经过传输层的,常用来抓包)

    SOCK_SEQPACKET 顺序包套接字

    #define SOCK_STREAM     1               /* stream socket */

    #define SOCK_DGRAM      2               /* datagram socket */

    #define SOCK_RAW        3               /* raw-protocol interface */

    #define SOCK_RDM        4               /* reliably-delivered message */

    #define SOCK_SEQPACKET  5               /* sequenced packet stream */

     

    参数c.Socket使用的协议类型

    通常将此设为0即IPPROTO_IP,是因为协议类型可以根据Socket的类型来确定,比如Sock_STREAM就是使用TCP协议,而SOCK_DGRAM就是使用UDP协议。

    其他的类型还有:

    #define IPPROTO_ICMP            1               /* control message protocol */

    #define IPPROTO_IGMP            2               /* internet group management protocol */

    #define IPPROTO_GGP             3               /* gateway^2 (deprecated) */

    #define IPPROTO_TCP             6               /* tcp */

    #define IPPROTO_PUP             12              /* pup */

    #define IPPROTO_UDP             17              /* user datagram protocol */

    #define IPPROTO_IDP             22              /* xns idp */

    #define IPPROTO_ND              77              /* UNOFFICIAL net disk proto */

    #define IPPROTO_RAW             255             /* raw IP packet */

    #define IPPROTO_MAX             256

    2.绑定

    绑定是为socket赋予一个名字,因为刚创建的socket是没有名字的,名字包括使用的地址族,ip地址,端口号等。

    参数a.socket,即需要绑定但尚未绑定的socket

    参数b.绑定的名称,类型为下面结构体的指针:

    struct sockaddr {

        unsigned short sa_family;

        char           sa_data[14];

    };

    其中,sa_family为地址族,在Microsoft的TCP/IP socket开发包中只支持Iternet的地址域(族),即只能使用AF_INET(或者PF_INET).

    sa_data为ip地址和端口等信息。14为所不同格式的ip地址和端口号的最大值。

    在使用时为了方便可以使用SOCKADDR_IN结构类型的强制类型转换指针来代替SOCKADDR类型的指针。由于两者的大小一样,所以指向sockaddr_in 的指针和指向sockaddr的指针可以直接进行强制类型转换。这意味着如果一个函数所需参数类型是sockaddr时,你可以在函数调用的时候将一个指向 sockaddr_in的指针转换为指向sockaddr的指针;或者相反。SOCKADDR_IN结构如下:

    struct sockaddr_in {

        short            sin_family;

        unsigned short      sin_port;

        struct   in_addr      sin_addr;

        char               sin_zero[8];

    };

    其中,sin_family和sa_family相同,sin_port是socket的端口号在赋值时需要使用htons进行从机器字节顺序到网络字节顺序的转换。

    其他的转换函数如下:

    htons():"Host to Network Short";

    htonl()  "Host to Network Long";

    ntohs()  "Network to Host Short";

    ntohl()  "Network to Host Long"

    在这里, h表示"host" ,n表示"network",s 表示"short",l表示 "long"

    sin_addr为IP地址,类型结构如下:

    struct   in_addr {

        union {

             struct {

                 unsigned  char s_b1,

                                s_b2,

                                s_b3,

                                s_b4;

             } S_un_b;

             struct {

                 unsigned  short  s_w1,

                                  s_w2;

             } S_un_w;

             unsigned long  S_addr;

         } S_un;

    };

    如果要表示ip为192.168.0.225的地址,赋值时可以如下:

    sin_addr.S_un.S_addr=((192*256+168)*256+0)*256+225(需要转换成网络字节序)。或者

    sin_addr.s_addr = htonl(INADDR_ANY)//在socket2.h里有#define s_addr Sun.S_addr

    //这里使用INADDR_ANY表示本机地址。其他的方法只要符合结构的规则都可以用。

    unsigned char sin_zero[8]; 是为了保持与struct sockaddr同样大小,一般填充0 

    在创建结构体对象时可以应该用bzero()或memset()函数将结构体对象置空。

    有关AF_INET的说明:

    AF_INET地址系列套接字可以是面向连接的(类型 SOCK_STREAM),也可以是无连接的(类型 SOCK_DGRAM)。面向连接的 AF_INET 套接字将 TCP 用作传输协议。无连接的 AF_INET 套接字将 UDP 用作传输协议。在创建 AF_INET 域套接字时,指定 AF_INET 作为套接字程序中的地址系列。AF_INET 套接字还可以使用类型 SOCK_RAW。如果设置了此类型,应用程序会直接连接至 IP 层,而不使用 TCP 或 UDP 传输。有关将环境设置为使用 AF_INET 地址系列的详细信息,参见套接字编程的先决条件。 有关使用 AF_INET 地址系列的样本程序,参见示例:面向连接的服务器示例:面向连接的客户机

  • 相关阅读:
    Spring+MyBatis纯注解零XML整合(4)
    spring boot-mybatis全注解化(3)
    SpringBoot使用Mybatis注解进行一对多和多对多查询(2)
    Spring Boot中使用MyBatis注解配置详解(1)
    mysql 俩个时间相减后取分钟
    mysql加减时间-函数-时间加减
    十种常见排序算法(转)
    开源VS商用,IBM区块链从Hyperledger到商用平台之道 | 对话IBM高级架构师【 笔记】(转)
    java中正则表达式基本用法(转)
    《数学之美》——维特比和他维特比算法
  • 原文地址:https://www.cnblogs.com/xinyuyuanm/p/2993699.html
Copyright © 2020-2023  润新知