socket编程函数详解

socket()

创新互联专注骨干网络服务器租用十载,服务更有保障!服务器租用,四川雅安服务器托管 成都服务器租用,成都服务器托管,骨干网络带宽,享受低延迟,高速访问。灵活、实现低成本的共享或公网数据中心高速带宽的专属高性能服务器。

#include

#include

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

返回值:成功返回一个文件描述符(注意,这个套接字不能用于和用户进行通信,只能用于listen和accept客户端的连接请求),失败返回-1

参数

domain          

AF_INET             IPv4 Internet protocols  

type

SOCK_STREAM        可以提供测序、可靠的双向,字节流

SOCK_DGRAM         支持数据报(无连接、不可靠消息的一个固定的最大长度)

protocol 

can be specified as 0

bind()

#include         

#include

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

返回值:成功返回0,失败返回-1

描述:

当创建一个套接字,它存在于一个名称空间(家庭地址),但没有地址分配给它。bind()将指定的地址赋给addr的套接字sockfd提到的文件描述符。addrlen,以字节为单位,指出通过addr的地址结构。传统上,这个操作称为“将一个名称分配给一个套接字”。

#define __SOCKADDR_COMMON(sa_prefix) \
sa_family_t sa_prefix##family

struct sockaddr_in

  {

    __SOCKADDR_COMMON (sin_);

    in_port_t sin_port;         /* Port number.  */

    struct in_addr sin_addr;        /* Internet address.  */

  };

typedef uint32_t in_addr_t;

struct in_addr

  {

    in_addr_t s_addr;

  };

listen()

#include       

#include

int listen(int sockfd, int backlog);

返回值:成功返回0,失败返回-1

参数:

backlog

待办事项列表参数定义等待连接的队列的最大长度为sockfd可能增长。如果一个连接请求到达队列满时,客户端可能会收到一个错误的指示ECONNREFUSED或者,如果底层协议支持重传,请求可能会被忽略,这样在连接成功后再尝试。

accept()

#include        

#include

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

描述:

accept()函数创建并返回了一个新的套接字client_sock,用于与客户端通信。

假设一共有3个客户端连接到服务器端。那么在服务器端就一共有4个套接字:第1个是socket()返回的、用于监听的套接字;其余3个是分别调用3次accept()返回的不同的套接字。

send()

#include        

#include

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

返回值:

>0   数据发送成功

<=0  发送失败需要重试

参数:

前三个参数等同于write

sockfd:发送端套接字描述符;

buf:发送端的发送缓冲区,用来暂时存放要发送的数据;

len:要发送数据的长度;

第四个参数flag的参数值说明:

socket编程函数详解

flag一般设为0

描述:

send先检查发送端要发送数据的长度len和sockfd发送缓冲区的长度,如果len>sockfd发送缓冲区的长度,函数返回SOCKET_ERROR;

如果len<=发送端缓冲区的长度,send就先检查协议是否正在发送 发送缓冲区的数据,如果协议正在发送数据,则send等待协议发完数据,如果此时协议还没有开始发送sockfd发送缓冲区的数据或者该缓冲区为空,那么send就比较len和sockfd发送缓冲区剩下的长度;

如果len>sockfd发送缓冲区的剩余长度,send就等待协议把发送缓冲区上的数据发送完毕,如果len<发送缓冲区的剩余长度,send就把buf中的数据copy到sockfd发送缓冲区的剩余空间里;

如果send函数copy成功,则返回实际拷贝的字节数,否则返回SOCKET_ERROR;send函数把数据copy到sockfd发送缓冲区后就返回了,此时这些数据不一定被对端收到了(因为数据的传输是由协议来完成的,send在copy之后就返回了),如果协议在传输数据的过程中出现网络错误的话,下一个send函数将出错返回SOCKET_ERROR;

每一个send在copy数据的时候都要等待上一个数据被协议传输到连接的另一端,如果协议在传输数据的过程,网络中断或出现异常,send函数就会返回SOCKET_ERROR.

recv()

#include     

#include

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

返回值:

<0  出错

=0  对方关闭了连接

>0  接收到数据的字节数

参数:

前三个参数等同于read

sockfd:接收端套接字描述符

buf:接收端接收缓冲区,存放

len:buf的长度

第四个参数和send()的一样,一般置为0

connect()

#include         

#include

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

参数:

sockfd:主动建立连接请求的套接字

addr:用来保存服务器端的端口号、ip地址


网页标题:socket编程函数详解
标题来源:http://hbruida.cn/article/gdjpsi.html