头文件:#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 个字符长度.
若为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 传给系统调用的参数不正确.