头文件:#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 传给系统调用的参数不正确.