温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

socket编程函数详解

发布时间:2020-06-14 13:53:08 来源:网络 阅读:644 作者:程红玲OOO 栏目:网络安全

socket()

#include <sys/types.h>

#include <socket.h>

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 <sys/types.h>         

#include <sys/socket.h>

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 <sys/types.h>       

#include <sys/socket.h>

int listen(int sockfd, int backlog);

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

参数:

backlog

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


accept()

#include <sys/types.h>        

#include <sys/socket.h>

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

描述:

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

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


send()

#include <sys/types.h>        

#include <sys/socket.h>

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 <sys/types.h>     

#include <sys/socket.h>

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

返回值:

<0  出错

=0  对方关闭了连接

>0  接收到数据的字节数

参数:

前三个参数等同于read

sockfd:接收端套接字描述符

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

len:buf的长度

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


connect()

#include <sys/types.h>         

#include <sys/socket.h>

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

参数:

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

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

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI