-
#include <sys/types.h>
-
#include <sys/socket.h>
-
int socket(int domain, int type, int protocol)
描述
socket() 创建一个通信的终端,返回该终端的描述符。
domain 指定了一个通信的网域,即指定协议簇中的一个,这些协议定义在 <
sys/socket.h> 中,常用的有一下几个:
AF_UNSPEC 0
AF_UNIX 1
AF_INET 2
AF_ROUTE 17
type 指定了socket的通信类型,主要有一下几个:
SOCKET_STREAM 1
SOCKET_DGRAM 2
SOCKET_RAW 3
SOCK_SEQPACKET 5
SOCK_PACKET 以废弃,过时的
SOCKET_STREAM 支持连续、可靠、全双工、面向连接的字节流,该类型的socket只有在连接的状态下才能发送和接受数据;
SOCKET_DGRAM 支持非面向连接的,不可靠的,最大长度固定的数据报;通常使用
recvfrom(可以指定接收数据的地址)来接收数据;
SOCKET_RAW 原始套接字;
protocol 指定一个特殊的协议;通常情况下,一个给定的协议和和一个给定的
socket type 决定了使用唯一的协议,这时候
protocol 就没有意义了,在这种情况下,设置
protocol 为0 。 但是有时候协议簇中的某个可以支持多个协议,在种情况下,就可以设置
protocol 决定使用那些协议;如AF_INET可以支持IPv4和IPv6,SOCKET_RAW 指定了任意类型的套接字类型,那么此时可以指定特定的
protocol,示例:
-
socket(AF_INET, SOCK_RAW, IPPROTO_TCP | IPPROTO_UDP | IPPROTO_ICMP);
protocol定义在<
netinet/in.h>中,常见的有:
IPPROTO_IP 0 /* Dummy protocol for TCP */
IPPROTO_ICMP 1 /* Internet Control Message Protocol */
IPPROTO_IGMP 2 /* Internet Group Management Protocol */
IPPROTO_TCP 6 /* Transmission Control Protocol */
IPPROTO_UDP 17 /* User Datagram Protocol */
IPPROTO_IPV6 41 /* IPv6-in-IPv4 tunnelling */
IPPROTO_RAW 255 /* Raw IP packets */
这里要说明的时IPPROTO_IP,它依赖于
socket type和
socket domain自动选择,如 指定
type 为 SOCK_STREAM 和
domain 为AF_INET,将会自动使用TCP,就和使用 IPPROTO_TCP 一样。如果将 IPPROTO_IP , AF_INET , SOCK_RAW 配合使用,将会出错,因为内核不知道该选择使用那个协议。
阅读(1061) | 评论(0) | 转发(0) |