您的位置:首页 > 编程语言

UNIX学习之路 一步一个脚印之socket编程/Socket的参数

2013-04-01 10:41 686 查看
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 地址系列的样本程序,参见示例:面向连接的服务器示例:面向连接的客户机
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐