TCP socket主要函数总结

如有转载,请注明出处:http://blog.csdn.net/embedded_sky

作者:super_bert@csdn

socket主要函数总结

1.socket函数原型

/**
 *头文件   #include <sys/types.h>
 *         #include <sys/socket.h>
 *函数说明:建立一个socket文件描述符 
 *函数原型 int socket(int domain, int type, int protocol)
 *参数列表 domain - AF_INET:IPv4协议
 *                  AF_INET6:IPv6协议
 *                  AF_LOCAL:Unix域协议
 *                  AF_ROUTE:路由套接口
 *                  AF_KEY:密钥套接口
 *         type   - SOCKET_STREAM:双向可靠数据流,对应TCP
 *                  SOCKET_DGRAM:双向不可靠数据报,对应UDP
 *                  SOCKET_RAW:提供传输层以下的协议,可以访问内部网络接口,例如接收和发送ICMP报文
 *        protocol- type为SOCKET_RAW时需要设置此值说明协议类型,其他类型设置为0即可
 *函数返回值  成功: socket文件描述符
 *            失败: -1,失败原因存于errno中
**/
int socket(int domain, int type, int protocol);
当进行socket调用时,中协议簇(domain)与类型(type)可能产生的组合如下表:


2.bind函数原型

/**
 *头文件   #include <sys/types.h>
 *         #include <sys/socket.h>
 *函数说明:	将一个协议地址与socket文件描述符联系起来 
 *函数原型 int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen)
 *参数列表 sockfd - socket文件描述符
 *           addr - my_addr指向sockaddr结构,该结构中包含IP地址和端口等信息
 *        addrlen - sockaddr结构的大小,可设置为sizeof(struct sockaddr)
 *函数返回值  成功: 0 
 *            失败: -1,失败原因存于errno中
**/
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
利用bind函数绑定地址时,可以指定IP地址和端口号,也可以指定其中之一,甚至一个也不指定。可以使用通配地址INADDR_ANY(为宏定义,其值等于0),它通知内核选择IP地址。

设置socket地址结构的几种方式,如下表:


3.listen函数原型

/**
 *头文件   #include <sys/types.h>
 *         #include <sys/socket.h>
 *函数说明:	等待连接
 *函数原型 int listen(int sockfd, int backlog)
 *参数列表 sockfd - 监听socket文件描述符
 *        backlog - 套接字排队的最大连接个数
 *函数返回值  成功: 0 
 *            失败: -1,失败原因存于errno中
 *特别说明 对于监听socket文件描述符sockfd,内核要维护两个队列,分别为未完成连接队列和已完成连接队列,这两个队列之和不超过backlog
**/
int listen(int sockfd, int backlog);

4.connect函数原型

/**
 *头文件   #include <sys/types.h>
 *         #include <sys/socket.h>
 *函数说明:	建立socket连接 
 *函数原型 int connect(int sockfd, const struct sockaddr *serv_addr, socklen_t addrlen)
 *参数列表 sockfd   - socket文件描述符
 *        serv_addr - 连接的网络地址和端口
 *         addrlen  - sockaddr结构的大小,可设置为sizeof(struct sockaddr)
 *函数返回值  成功: 0 
 *            失败: -1,失败原因存于errno中
 *特别说明 函数connect激发TCP的三路握手过程,出错返回有以下几种情况:
 *         ①如果客户没有收到SYN分节的响应(总共75秒,这之间可能重发了若干次SYN),则返回ETIMEDOUT
 *         ②如果对客户的SYN的响应是RST,则表明该服务器主机在指定的端口上没有进程在等待与之相连,函数返回错误ECONNREFUSED
 *         ③如果客户发出的SYN在中间路由器上引发一个目的地不可达的ICMP错误,内核返回EHOSTUNREACH或ENETUNREACH错误(即ICMP错误)给进程
**/
int connect(int sockfd, const struct sockaddr *serv_addr, socklen_t addrlen);

5.accept函数原型

/**
 *头文件   #include <sys/types.h>
 *         #include <sys/socket.h>
 *函数说明:	接受socket连接,返回一个新的socket文件描述符,原socket文件描述符仍为listen函数所用,而新的socket文件描述符用来处理连接的读写操作 
 *函数原型 int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen)
 *参数列表 sockfd - socket文件描述符
 *           addr - 填入远程主机的地址数据(传出参数)	
 *        addrlen - sockaddr结构的大小,可设置为sizeof(struct sockaddr)
 *函数返回值  成功: 实际读取字节数 
 *            失败: -1,失败原因存于errno中
 *特别说明  ①accept函数由TCP服务器调用,为阻塞函数,从已完成连接的队列中返回一个连接;如果该对列为空,则进程进入阻塞等待
 *          ②函数返回的套接字为已连接套接字,而监听套接字仍为listen函数所用
**/
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

6.close函数原型

/**
 *头文件   #include <unistd.h>
 *函数说明:	关闭连接的socket文件描述符 
 *函数原型 int close(int sockfd)
 *参数列表 sockfd - socket文件描述符
 *函数返回值  成功: 0
 *            失败: -1,失败原因存于errno中
 *特别说明  ①close函数默认功能是将套接字置为“已关闭”标记,并立即返回给进程,这个套接字不能再为该进程所用
 *          ②正常情况下,close将引发四个分节终止序列,但在终止前将发送已排队的数据
 *          ③如果套接字描述符访问计数在调用close后大于0(多个进程共享同一个套接字的情况下),则不会引发TCP终止序列(即不会发送FIN分节)
**/
int close(int sockfd);

7.shutdown函数原型

/**
 *头文件   #include <sys/socket.h>
 *函数说明:	终止socket通信
 *函数原型 int close(int sockfd)
 *参数列表 sockfd - socket文件描述符
 *           how  - 0(SHUT_RD):关闭socket连接的读这一半,不再接收套接字中的数据且现留在收缓冲区的数据作废
 *                  1(SHUT_WR):关闭socket连接的写这一半(半关闭),但留在套接字发送缓冲区中的数据都会被发送,后跟TCP连接终止序列,不管访问计数是否大于0,此后将不能再执行对套接字的任何写操作
 *                  2(SHUT_RDWR):socket连接的读、写都关闭
 *函数返回值  成功: 0
 *            失败: -1,失败原因存于errno中
**/
int shutdown(int s, int how);

8.read函数原型

/**
 *头文件   #include <unistd.h>
 *函数说明:	从打开的socket文件流中读取数据,这里仅说明此函数应用于socket的情况
 *函数原型 ssize_t read(int fd, void *buf ,size_t count)
 *参数列表 fd   - socket文件描述符
 *         buf  - 读取数据的首地址(传出参数)
 *         count- 最大读取字节数
 *函数返回值  成功: 实际读取字节数
 *            失败: -1,失败原因存于errno中
 *特别说明  调用函数read从socket文件流中读取数据时,有如下几种情况:
 *          ①套接字接收缓冲区接收数据,返回接收到的字节数
 *          ②TCP协议收到FIN数据,返回0
 *          ③TCP协议收到RST数据,返回-1,同时errno设置为ECONNRESET
 *          ④进程阻塞过程中接收到信号,返回-1,同时errno设置为EINTR
**/
ssize_t read(int fd, void *buf ,size_t count);

9.write函数原型

/**
 *头文件   #include <unistd.h>
 *函数说明:	向socket文件流中写入数据,这里仅说明此函数应用于socket的情况
 *函数原型 ssize_t write (int fd,const void *buf, size_t count)
 *参数列表 fd   - socket文件描述符
 *         buf  - 写入数据的首地址
 *         count- 最大写入字节数
 *函数返回值  成功: 实际写入的字节数
 *            失败: -1,失败原因存于errno中
 *特别说明  调用函数write向socket文件流写数据时,有如下几种情况:
 *          ①套接字发送缓冲区有足够空间,返回发送的字节数
 *          ②TCP协议接收到RST数据,返回-1,同时errno设置为ECONNRESET
 *          ③进程阻塞过程中接收到信号,返回-1,同时errno设置为EINTR
**/
ssize_t write (int fd,const void *buf,size_t count);

10.send函数原型

/**
 *头文件   #include <sys/types.h>
 *         #include <sys/socket.h>
 *函数说明:	通过socket文件描述符发送数据到对方
 *函数原型 ssize_t send(int socket, const void *buf, size_t len, int flags)
 *参数列表 socket - socket文件描述符
 *         buf    - 发送数据的首地址
 *         len    - 发送数据的长度
 *         flags  - 0:此时功能同write,flags还可以设为以下标志的组合
 *                  MSG_OOB:发送带外数据
 *                  MSG_DONTROUTE:告诉IP协议,目的主机在本地网络,没有必要查找路由表
 *                  MSG_DONTWAIT:设置为非阻塞操作
 *                  MSG_NOSIGNAL:表示发送动作不愿被SIGPIPE信号中断
 *函数返回值  成功: 实际发送的字节数
 *            失败: -1,失败原因存于errno中
**/
ssize_t send(int s, const void *buf, size_t len, int flags);

11.recv函数原型

/**
 *头文件   #include <sys/types.h>
 *         #include <sys/socket.h>
 *函数说明:	通过socket文件描述符从对方接收数据
 *函数原型 ssize_t recv(int socket, void *buf, size_t len, int flags)
 *参数列表 socket - socket文件描述符
 *         buf    - 接收数据的首地址
 *         len    - 可接收数据的最大长度
 *         flags  - 0:此时功能同read,flags还可以设为以下标志的组合
 *                  MSG_OOB:接收带外数据
 *                  MSG_PEEK:查看数据标志,返回的数据并不在系统中删除,如果再次调用recv函数会返回相同的数据内容
 *                  MSG_DONTWAIT:设置为非阻塞操作
 *                  MSG_WAITALL:强迫接收到len大小的数据后才返回,除非有错误或有信号产生
 *函数返回值  成功: 实际接收的字节数
 *            失败: -1,失败原因存于errno中
**/
ssize_t recv(int socket, void *buf, size_t len, int flags);


猜你喜欢

转载自blog.csdn.net/qq302501035/article/details/45845005