[置顶] 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 地址系列的样本程序,参见示例:面向连接的服务器示例:面向连接的客户机

 

你可能感兴趣的:(socket编程)