Socket

来源:互联网 发布:股票编程接口 编辑:程序博客网 时间:2024/04/28 10:24

Socket

int socket(int domain, int type, int protocol);

 

 

参数说明:

domain:协议域,又称协议族(family)。

             常用的协议族有AF_INET、 AF_INET6、AF_LOCAL(或称AF_UNIX,Unix域Socket)、AF_ROUTE等。协议族决定了socket的地址类型,在通信 中必须采用对应的地址,如AF_INET决定了要用ipv4地址(32位的)与端口号(16位的)的组合、AF_UNIX决定了要用一个绝对路径名作为地 址。

 

 

type:指定Socket类型。

【TCP/IP里面只能是两个 SOCK_STREAM ,SOCK_DGRAM 】

 1、     sock_stream   是有保障的(即能保证数据正确传送到对方)面向连接的SOCKET,多用于资料(如文件)传送。

                   SOCK_STREAM是基于TCP的,数据传输比较有保障

                   SOCK_STREAM 是数据流,一般是tcp/ip协议的编程

2 、     sock_dgram   是无保障的面向消息的socket , 主要用于在网络上发广播信息。

        SOCK_DGRAM是基于UDP的,专门用于局域网,基于广播

        SOCK_DGRAM分是数据报,是udp协议网络编程

      原始套接字(SOCK_RAW)是一种不同于SOCK_STREAM、SOCK_DGRAM的套接字,它实现于系统核心。然而,原始套接字能做什么呢?首先来说,普通的套接字无法处理ICMP、IGMP等网络报文,而SOCK_RAW可以;其次,SOCK_RAW也可以处理特殊的IPv4报文;此外,利用原始套接字,可以通过IP_HDRINCL套接字选项由用户构造IP头。总体来说,SOCK_RAW可以处理普通的网络报文之外,还可以处理一些特殊协议报文以及操作IP层及其以上的数据。

既然SOCK_RAW有以上特性,所以在某些处理流程上它区别于普通套接字。

·  若设置IP_HDRINCL选项,SOCK_RAW可以操作IP头数据(也就是用户需用填充IP头及其以上的payload);否则SOCK_RAW无法操作IP头数据

·  端口对于SOCK_RAW而言没有任何意义

·  如果使用bind函数绑定本地IP,那么如果IP_HDRINCL未设置,则用此IP填充源IP地址;若不调用bind则将源IP地址设置为外出接口的主IP地址

·  如果使用connect函数设置目标IP,则可以使用send或者write函数发送报文,而不需要使用sendto函数

·  内核处理流程:

 

·   接收到的TCP、UDP分组不会传递给任何SOCK_RAW

·  ICMP、IGMP报文分组传递给SOCK_RAW

·  内核不识别的IP报文传递给SOCK_RAW

·  SOCK_RAW是否接收报文:

·      Protocol指定类型需要匹配,否则不传递给该SOCK_RAW

·       如果使用bind函数绑定了源IP,则报文目的IP必须和绑定的IP匹配,否则不传递给该SOCK_RAW

·       如果使用connect函数绑定了目的IP,则报文源IP必须和指定的IP匹配,否则不传递给该SOCK_RAW 

 

综上所述,原始套接字处理的只是IP层及其以上的数据,比如实现SYN FLOOD攻击、处理PING报文等。当需要操作更底层的数据的时候,就需要采用其他的方式。

4、SOCK_PACKE

        建立套接字的时候选择SOCK_PACKET类型,内核将不对网络数据进行处理而直接交给用户,数据直接从网卡的协议栈交给用户。建立一个SOCK_PACKET类型的套接字使用如下方式:

1 socket (AF_INET, SOCK_PACKET,htons(0x0003)); 

其中AF_INET=2表示因特网协议族,SOCK_PACKET=10表示截取数据帧的层次在物理层,网络协议栈对数据不做处理。值0x0003表示截取的数据帧的类型为不确定,处理所有的包。

 

5、SOCK_SEQPACKET

在IP(AF_INET)协议里并没有SOCK_SEQPACKET类型.
而是在IPX/SPX(AF_IPX ), NetBIOS (AF_NETBIOS)中才会出现.

 

 

 

protocol:指定协议。常用协议有IPPROTO_TCP、IPPTOTO_UDP、IPPROTO_SCTP、IPPROTO_TIPC等,分别对应TCP传输协议、UDP传输协议、STCP传输协议、TIPC传输协议。

 

 

 

返回值:

如果调用成功就返回新创建的套接字的描述符,如果失败就返回INVALID_SOCKET(Linux下失败返回-1)。套接字描述符是一个整数类型的值。每个进程的进程空间里都有一个套接字描述符表,该表中存放着套接字描述符和套接字数据结构的对应关系。该表中有一个字段存放新创建的套接字的描述符,另一个字段存放套接字数据结构地址,因此根据套接字描述符就可以找到其对应的套接字数据结构。每个进程在自己的进程空间里都有一个套接字描述符表但是套接字数据结构都是在操作系统内核缓冲里。

0 0
原创粉丝点击