关于connect探究

xiaoxiao2021-02-28  75

头文件:#include <sys/types.h>  

     #include <sys/socket.h>

定义函数:int connect(int sockfd, struct sockaddr * serv_addr, int addrlen);

函数说明:connect()用来将参数sockfd 的socket 连至参数serv_addr 指定的网络地址.   //就是将一个socket与网络的IP建立连接,成功或失败都会 //有返回值,成功后可以与send()和recv()这两个函数结合使用

结构sockaddr请参考bind(). 

参数addrlen 为sockaddr 的结构长度

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

错误代码: 1、EBADF 参数sockfd 非合法socket 处理代码 2、EFAULT 参数serv_addr 指针指向无法存取的内存空间 3、ENOTSOCK 参数sockfd 为一文件描述词, 非socket. 4、EISCONN 参数sockfd 的socket 已是连线状态 5、   ETIMEDOUT 企图连线的操作超过限定时间仍未有响应. 6、ENETUNREACH 无法传送数据包至指定的主机. 7、EAFNOSUPPORT sockaddr 结构的sa_family 不正确. 8、EALREADY socket 为不可阻断且先前的连线操作还未完成.

<!--

bind()(与connect是相同的头文件)

int bind(int sockfd, struct sockaddr * my_addr, int addrlen); 函数说明:bind()用来设置给参数sockfd 的socket 一个名称. 此名称由参数my_addr 指向一sockaddr 结构,

返回值:成功则返回0, 失败返回-1, 错误原因存于errno 中. 错误代码: 1、EBADF 参数sockfd 非合法socket 处理代码. 2、EACCESS 权限不足 3、ENOTSOCK 参数sockfd 为一文件描述词, 非socket.

sockaddr 结构会因使用不同的socket domain 而有不同结构定义

通用的定义:

struct sockaddr {    unsigned short int sa_family;    char sa_data[14]; };

1、sa_family 为调用socket()时的domain 参数, 即AF_xxxx 值.     sa_family一般为AF_INET,代表Internet(TCP/IP)地址族    2、sa_data 最多使用14 个字符长度.  sa_data为 14字节的协议地址,则包含该socket的IP地址和端口号。

若为AF_INET domain,其socketaddr 结构定义便为 struct socketaddr_in {    unsigned short int sin_family;    uint16_t sin_port;    struct in_addr sin_addr;    unsigned char sin_zero[8]; }; struct in_addr        //32位 IP地址 {    uint32_t s_addr; }; 1、sin_family 即为sa_family 2、sin_port 为使用的port 编号 3、sin_addr. s_addr 为IP 地址 sin_zero 未使用. 参数 addrlen 为sockaddr 的结构长度.

-->

send()

定义函数:int send(int s, const void * msg, int len, unsigned int falgs); 函数说明:send()用来将数据由指定的socket 传给对方主机. 参数s 为已建立好连接的socket.

 参数msg 指向欲连线的数据内容, 

参数len 则为数据长度. 

参数flags 一般设0, 其他数值定义如下:      MSG_OOB 传送的数据以out-of-band 送出.    MSG_DONTROUTE 取消路由表查询    MSG_DONTWAIT 设置为不可阻断运作    MSG_NOSIGNAL 此动作不愿被SIGPIPE 信号中断. 返回值:成功则返回实际传送出去的字符数, 失败返回-1. 错误原因存于errno 错误代码:    EBADF 参数s 非合法的socket 处理代码.    EFAULT 参数中有一指针指向无法存取的内存空间    ENOTSOCK 参数s 为一文件描述词, 非socket.    EINTR 被信号所中断.    EAGAIN 此操作会令进程阻断, 但参数s 的socket 为不可阻断.    ENOBUFS 系统的缓冲内存不足    ENOMEM 核心内存不足    EINVAL 传给系统调用的参数不正确.

recv()

定义函数:int recv(int s, void *buf, int len, unsigned int flags); 函数说明:recv()用来接收远端主机经指定的socket 传来的数据, 并把数据存到由参数buf 指向的内存空间, 参数len 为可接收数据的最大长度. 参数 flags 一般设0. 其他数值定义如下: 1、MSG_OOB 接收以out-of-band 送出的数据. 2、MSG_PEEK 返回来的数据并不会在系统内删除, 如果再调用recv()会返回相同的数据内容. 3、MSG_WAITALL 强迫接收到len 大小的数据后才能返回, 除非有错误或信号产生. 4、MSG_NOSIGNAL 此操作不愿被SIGPIPE 信号中断返回值成功则返回接收到的字符数, 失败返回-1,错误原因存于errno 中. 错误代码:    EBADF 参数s 非合法的socket 处理代码    EFAULT 参数中有一指针指向无法存取的内存空间    ENOTSOCK 参数s 为一文件描述词, 非socket.    EINTR 被信号所中断    EAGAIN 此动作会令进程阻断, 但参数s 的socket 为不可阻断    ENOBUFS 系统的缓冲内存不足.    ENOMEM 核心内存不足    EINVAL 传给系统调用的参数不正确.

转载请注明原文地址: https://www.6miu.com/read-38116.html

最新回复(0)