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