socket基本操作

来源:互联网 发布:windows xp镜像 编辑:程序博客网 时间:2024/05/22 16:54

什么是Socket

socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,都可以用“打开open –> 读写write/read –> 关闭close”模式来操作。我认为Socket就是该模式的一个实现,socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO、打开、关闭)。


Socket 的基本操作:

1、scocket()函数(创建一个socket连接)

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

这个方法返回一个socket描述字,即socket的唯一标识,在后面的操作中会用到它,把它作为参数进行一些读写操作。

参数介绍

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

  • type: 指定socket类型。常用的socket类型有,SOCK_STREAM、SOCK_DGRAM、SOCK_RAW、SOCK_PACKET、SOCK_SEQPACKET等等。
  • protocol:故名思意,就是指定协议。常用的协议有,IPPROTO_TCP、IPPTOTO_UDP、IPPROTO_SCTP、IPPROTO_TIPC等,它们分别对应TCP传输协议、UDP传输协议、STCP传输协议、TIPC传输协议。



2、connect()函数(连接目标主机)

int connect(int sockfd, const struct sockaddr *name, int namelen);

客户端通过这个方法来建立与服务器的连接。

参数介绍:

sockfd : socket描述字

name : 服务器的socket地址

namelen : socket地址长度


3、send()函数 (发送内容)

ssize_t send(int sockfd, const void *msg, size_t len, int flags);

这个方法用于向目标主机发送数据

sockfd : socket描述字

msg : 数据(字节)

len : 数据长度

flags : 指定套接字的发送和接收行为,一般默认为0:表示不对此调用使用标志。这个参数的详解http://technet.microsoft.com/zh-cn/magazine/system.net.sockets.socketflags(VS.90).aspx


4、recv() (接收内容)

ssize_t recv(int sockfd, void *buf, size_t len, int flags);

sockfd : socket描述字

buf : 数据

len : 数据长度

flags : 指定套接字的发送和接收行为,一般默认为0


5、close() (关闭socket连接)

 int close(int sockfd);

sockfd : socket描述字


服务器端用到的其它函数:

6、bind()函数 

int bind(int sockfd , const struct sockaddr *addr , socklen_t addrlen)

这个函数把一个地址族中的特定地址赋值给socket,这个方法会在服务器端调用listen之前调用

参数介绍:

sockfd : socket描述字

addr : 一个指针,指向要绑定给sockfd的协议地址(根据不同的地址协议族来创建不同的地址)


7、listen()函数 (监听客户端请求)

int listen(int sockfd, int backlog)

这个方法在服务器和客户端建立连接后被调用,用于监听客户端的请求。

参数介绍:

sockfd : socket描述字

backlog : socket可以排队的最大连接个数


8、accept()函数 (接受请求)

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen)

在服务器监听到客户端请求之后,调用这个方法来接受客户端请求,这样连接就建立好了。

参数介绍:

sockfd : socket描述字

addr : 客户端的协议地址

addrlen : 协议地址的长度