1、socket函数服务器
一、头文件:网络
#include <sys/types.h> /* See NOTES */dom
#include <sys/socket.h>socket
二、函数原型:函数
int socket(int domain, int type, int protocol);spa
socket函数相似于open,用来打开一个网络链接,若是成功则返回一个网络文件描述符(int类型),以后咱们操做这个网络链接都经过这个网络文件描述符。接口
dimain:域,网络域,网络地址范围(IPV4或IPV6等),也就是协议簇ip
type:指定套接字类型:SOCK_STREAM(TCP网络)、SOCK_DGRAM(UDP)、SOCK_SEQPACKET原型
protocol:指定协议,若是指定0,表示使用默认的协议date
三、函数形参:
3.一、domain:(域)
AF_INET ip
AF_INET6 ipv6
AF_PACKET packet 低级数据包接口
PF_PACKET 不懂,待了解
PF_INET 待了解(AF开头的表示地址族,PF开头的表示协议族,协议族包含多个地址族,可是当前这种还从未实现,而在<sys/socket.h>中PF的值老是与AF的值相等的)
3.二、type:(套接字类型):
SOCK_RAW 原始套接字 ——>使用原始套接字时候调用,原始套接字也就是链路层协议
SOCK_STREAM 字节流套接字 ——>提供顺序,可靠,双向,基于链接的字节流。 能够支持带外数据传输机制。例如:TCP协议、FTP协议
SOCK_DGRAM 数据报套接字 ——>支持数据报(无链接,不可靠的固定最大长度的消息)例如:UDP协议
SOCK_SEQPACKET 有序分组套接字 ——>为固定最大长度的数据报提供有序,可靠,双向链接的数据传输路径; 消费者须要利用每一个输入系统调用读取整个分组
3.三、protocol(协议):
IPPROTO_IP IP传输协议
IPPROTO_TCP TCP传输协议
IPPROTO_UDP UDP协议
IPPROTO_SCTP SCTP传输协议
IPPROTO_ICMP ICMP协议
IPPROTO_IGMP IGMP协议
通常状况下IPPROTO_TCP、IPPROTO_UDP、IPPROTO_ICMP协议用的最多,UDP协议protocol就取IPPROTO_UDP,TCP协议protocol就取IPPROTO_TCP;通常状况下,咱们让protocol等于0就能够,系统会给它默认的协议。可是要是使用raw socket协议,protocol就不能简单设为0,要与type参数匹配.
四、返回值:
成功时返回一个小的非负整数值,他与文件描述符相似,咱们称为套接字描述符,简称sockfd。失败,则返回-1。
五、例子:
g_ulDevRawSock = socket( PF_PACKET, SOCK_RAW, htons(ETH_DEV) ); //#define ETH_DEV 0x8607
iFd = socket(AF_INET, SOCK_DGRAM,IPPROTO_UDP);
fd = socket(PF_INET, SOCK_DGRAM, 0);
dnc_socket = socket(AF_INET, SOCK_STREAM, 0);
pupdate_info->update_socket = socket(PF_PACKET, SOCK_RAW, htons(0x8505)
2、connect函数
一、头文件:
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
二、函数原型:
int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
TCP客户端经过connect函数与服务端链接,进行通讯。
三、函数形参:
3.一、sockfd(客户端本身建立的sock)
3.二、addr(服务端地址族、服务端IP地址、服务端端口号)
3.三、addrlen(服务端地址字节长度)
四、返回值:
链接成功,返回0,链接失败,返回-1
五、例子:
seraddr.sin_family = AF_INET; // 设置地址族为IPv4
seraddr.sin_port = htons(SERPORT); // 设置地址的端口号信息
seraddr.sin_addr.s_addr = inet_addr(SERADDR); // 设置IP地址
ret = connect(sockfd, (const struct sockaddr *)&seraddr, sizeof(seraddr));
3、bind函数
一、头文件:
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
二、函数原型:
int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
服务端套接字绑定本身的IP地址与端口号,客户端那边能够不写,内核会给它分配一个临时的端口。
三、函数形参:
3.一、sockfd:服务器或者客户端本身建立的socket
3.二、addr:服务器或者客户端本身的地址信息(协议族、IP、端口号)
3.三、addrlen:服务器或者客户端本身的地址信息的长度
四、返回值:
绑定成功,返回0,失败返回-1
五、例子:
seraddr.sin_family = AF_INET; // 设置地址族为IPv4
seraddr.sin_port = htons(SERPORT); // 设置地址的端口号信息
seraddr.sin_addr.s_addr = inet_addr(SERADDR); // 设置IP地址
ret = bind(sockfd, (const struct sockaddr *)&seraddr, sizeof(seraddr));