Socket网络编程中的函数详解

来源:互联网 发布:淘宝招聘客服 编辑:程序博客网 时间:2024/05/22 07:01

Socket网络编程中的很多函数既可以在服务端调用也可以在客户端调用,这篇博文对每个函数只介绍一次。
一、服务端经常调用的函数:
1)socket():创建一个套接口。

#include <sys/socket.h>int socket(int domain, int type, int protocol);   

*domain: 协议域,又称为协议族。常用的协议有AF_INET、AF_INET6、AF_LOCAL(或称AF_UNIX,UNIX域socket)、AF_ROUTE等等。协议族决定了socket的地址类型,在通信中必须采用相应的地址,如AF_INET决定了要用ipv4地址(32位的)与端口号(16位的)的组合。

*type: 制定socket类型。有SOCK_STREAM、SOCK_DGRAM、SOCK_RAW、SOCK_PACKET、SOCK_SEQPACKET等等。我们经常用到的SOCK_STREAM是基于TCP的socket类型。

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

需要注意的是上面的type和protocol并不能随意搭配,但是当protocol为0是会自动选择type类型的对应的默认协议,所以我们一般都将protocol设为0。

socket()函数返回一个socket描述符,它唯一标识一个socket。

2)bind():将一本地地址与一套接口捆绑。

#include <sys/socket.h>int bind(int socket, const struct sockaddr *address, socklen_t address_len);

*socket: 就是socket()函数创建的socket描述符。

*address: 指向了一个结构为sockaddr参数的指针,sockaddr中包含了地址,端口和IP地址的信息。在进行地址绑定的时候,需要先将地址结构中的IP地址、端口、类型等结构与struct sockaddr中的域进行设置之后才能进行绑定,这样绑定后才能将套接字描述符与地址等结合在一起。

*address_len: 是address结构的长度,可以设置成sizeof(struct sockaddr)。

bind()函数的返回值为0时表示绑定成功,-1表示绑定失败。

3)listen():表示让一个套接字处于监听到来的连接请求的状态。

#include <sys/socket.h>int listen(int sockfd, int backlog);  

*sockfd: 被listen()函数作用的套接字。

*backlog: 指定同时能处理的最大连接请求,如果连接数目达到此上限则client端将收到ECONNREFUSED的错误。

返回值:成功返回0,失败返回-1,错去原因存于errno。

4)accept():在一个套接口接受一个连接,返回一个新的套接字。

#include <sys/socket.h>int accept(int socket, struct sockaddr *restrict address, socklen_t *restrict address_len);

*socket:socket()函数创建的套接字描述符。

*restrict address: 指向struct sockaddr的指针,该结构用通讯层服务器对套接字的地址(一般为客户端地址)填写,返回地址的确切格式由套接字的地址类别决定。

*restrict address_len:调用函数时需要初始化为restrict address所指向的结构的大小的数值。一般设置为sizeof(struct sockaddr_in)。

返回值:成功时,返回非负整数,该整数是接收到的套接字的描述符;出错时返回-1,相应地设定全局变量errno。

5)send()和recv():用来发送数据和接收数据的函数。

#include <sys/socket.h>ssize_t send(int sockfd, const void *buf, size_t len, int flags); ssize_t recv(int sockfd, void *buf, size_t len, int flags);

*sockfd:指定发送端或者接收端的套接字。

*buf:指明一个存放要发送或者接收的数据的缓冲区。

*len:指明实际要发送或者接收的数据的字节数。

*flags:用来控制读写操作。一般是0(当flag为0时与read,write函数的操作相同)或者以下组合:


MSG_DONTROUTE:不查找路由表
MSG_OOB:接受或发送带外数据
MSG_PEEK:查看数据,并不从系统缓冲区移走数据
MSG_WAITALL:等待任何数据


返回值:
send():若无错误发生,send()函数返回所发送数据的总数(可能小于len中所规定的大小),否则的话返回SOCKET_ERROR错误,应用程序可通过WASGetLastError()获取相应的错误代码。
recv():>0 接受到的数据大小;==0 连接关闭;<0 出错

二、客户端经常调用的函数:
1)connect():用于建立与指定socket的连接。

#include <sys/socket.h>int connect(int s,const struct sockaddr* serv_addr,int addrlen)

*s:标识一个未连接的socket
*serv_addr:套接字想要连接的主机地址和端口号。
*addrlen:sockaddr结构体的字节长度。

返回值:
成功返回0,失败返回-1,错误原因存于errno中。

0 0
原创粉丝点击