1>用到的头文件
#include<stdio.h>
#include<sys/types.h>
#incllude<sys/socket.h>
#include<arpa/inet.h>
#include<netinet/in.h>
2>用到的函数
int socket(int domain ,int type, int protocol) //具有网络属性的文件描述符生成函数
参数:
1>domain 地址族
AF_UNXI,AF_LOCAL //本地连接协议
AF_INET //IPV4协议
AF_INET6 //IPV6协议
2>type:协议
SOCK_STREAM //流式套接字(TCP)
SOCK_DGRAM //数据报文套接字(UDP)
SOCK_RAW //原始套接字,不选用任何协议
3>protocol:参数生效值
默认选 0 使得前两个参数生效
返回值:
成功:返回具有网络属性的套接字文件描述符
失败:返回-1,设置错误码
int bind(int sockfd , const struct sockaddr *addr , socklen_t addrlen)
自带结构体
struct sockaddr
{
sa_family_t sa_family; //地址族 类型unsigned short
char sa_data[14]; //存放 IP 和 端口号
}
一般不用这个结构体,因为IP和端口号放到一块去了,赋值比较麻烦
通常采用另一个结构体之后强转为 struct sockaddr 类型即可
通常采用结构体为
struct sockaddr_in
{
short sin_family; //地址族
short sin_port; //端口号
struct in_addr sin_addr;
//该结构体下有个s_addr用来给IPV4地址赋值
unsigned char sin_zero[8]; //填充位
}
参数:
1>sockfd 套接字文件描述符
2>const struct sockaddr *addr IP地址与端口号存放的结构体的地址
3>socklen_t addrlen IP地址与端口号存放的结构体的长度/大小
给bind 该函数的参数赋值时要注意
将我们 计算机用的小端序 --> 网络用的大端序
小端序:低位数据 保存在 低位地址上
大端序:低位数据 保存在 高位地址上
端口号小转大
uint32_t htonl(uint32_t hostlong); 针对32位
uint16_t htons(uint16_t hostshort); 针对16位
端口号大转小
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);
以上函数成功返回转换成功的端口号
IP号要将写的点分十进制转化为网络二进制
in_addr_t inet_addr(const char *cp);
参数:cp为输入的字符串IP地址 如 "192.168.xx.xx "
成功返回二进制地址
失败转化无效,返回INADDR_NONE
int listen(int sockfd, int backlog);
功能:用来限制服务器同一时刻接入客户端的最大值
参数:
sockfd:同上
backlog:同一时刻接入客户端的最大值
返回值
成功返回 0
失败返回-1,设置错误码
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen)
功能: 服务器 阻塞等待客户连接
参数:
sockfd:生成好的具有网络属性的套接字文件描述符
addr: 客户端的IP和端口号的地址
(把之前定义的(struct scokaddr_in)类型的 结构体
取地址后 再 强转为(struct sockaddr *)类型)
addrlen: 客户端IP和端口号的长度,需要把它的地址传进来
(可通过 socklen_t len = sizeof(struct sockaddr_in ) ,再 &len即可)
返回值:
成功返回客户端的文件描述符
失败返回-1,且设置错误码
int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen)
功能:客户端 连接 服务器
参数:同上将对象客户端换成服务器即可
返回值:
成功:返回0
失败:返回-1,并设置错误码
收/发
ssize_t recv(int sockfd, void *buf, size_t len, int flags)
功能:接收数据
参数:
注意与上面的scokfd区别
scokfd:发送者的文件描述符 (接收谁?)
buf: 存放接收的数据的地方
len: 接收数据的长度/大小 一般不大于buf的长度/大小
flags: 设置为0 阻塞
返回值:
成功返回接收到的字节数
失败返回-1,并设置错误码
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
功能:发送数据
参数:
注意与上面的scokfd区别
scokfd:接收者的文件描述符 (发给谁?)
buf: 存放接收的数据的地方
len: 发送数据的长度/大小 一般不大于buf的长度/大小
flags: 设置为0 阻塞
返回值:
成功返回发送的字节数
失败返回-1,并设置错误码