【1】流程:
举个例子:
买个手机和卡
手机和卡必须匹配
将卡和手机进行绑定
设置为非飞行模型
进行通信
服务器端:
创建套接字 socket( )
填充服务器网络信息结构体
将套接字与网络信息结构体绑定 bind( )
将套接字设置为监听状态 listen( )
阻塞等待客户端的连接请求 accept( )
进行通信 recv( )/send( )
客户端:
创建套接字 socket( )
填充服务器网络信息结构体
发送客户端的连接请求 connect( )
进行通信 send( )/recv( )
【2】socket( )
#include
#include
int socket(int domain, int type, int protocol);
功能:创建套接字,返回文件描述符
参数:
domain:通信域(协议族)
AF_UNIX 本地通信
AF_INET 网络通信
AF_PACKET 底层通信
type:类型
SOCK_STREAM 流式套接字 TCP
SOCK_DGRAM 数据报套接字 UDP
SOCK_RAM 底层的
protocol:协议
一般为0,如果需要其他协议则设置
返回值:
成功:文件描述符
失败:-1
【3】bind( )
#include
#include
int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
功能:将套接字与网络信息结构体绑定
参数:
sockfd:文件描述符,socket的返回值
addr:网络信息结构体
通用的:
struct sockaddr {
sa_family_t sa_family; 2个字节
char sa_data[14]; 14个字节
}
一般使用:sockaddr_in
#include
struct sockaddr_in
{
__SOCKADDR_COMMON (sin_);
===>
#define __SOCKADDR_COMMON(sa_prefix) \
sa_family_t sa_prefix##family
在宏函数里面,##代码表字符串的拼接
==>sa_family_t sin_family; 协议族 2个字节
in_port_t sin_port; 端口号 2个字节
struct in_addr sin_addr;
===>
struct in_addr {
__be32 s_addr; IP地址 4个字节
};
没有用,为了是sockaddr_in和sockaddr保持大小一致
unsigned char sin_zero[sizeof (struct sockaddr) -
__SOCKADDR_COMMON_SIZE -
sizeof (in_port_t) -
sizeof (struct in_addr)];
};
addrlen:addr的长度
返回值:
成功:0
失败:-1
例子:
struct sockaddr_in serveraddr;/定义变量
serveraddr.sin_family = AF_INET;//填充地址信息 地址族
serveraddr.sin_port = htons(9999);//填充地址信息 端口号
serveraddr.sin_addr.s_addr = inet_addr(“192.168.2.27”);//填充地址信息 IP地址
if(bind(sockfd, (struct sockaddr *)&serveraddr, sizeof(struct sockaddr_in)) < 0)
{
perror("fail to bind");
exit(1);
}
【4】listen( )
#include
#include
int listen(int sockfd, int backlog);
功能:将套接字设置为监听状态
参数:
sockfd:文件描述符,socket的返回值
backlog:允许同时处理客户端的个数,一般设置为5 10
返回值:
成功:0
失败:-1
【5】accept( )
#include
#include
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
功能:阻塞等待客户端的连接请求
参数:
sockfd:文件描述符,socket的返回值
addr:网络信息结构体(自动填充客户端的信息,如果位NULL, 则得不到客户端的IP地址和端口号)
addrlen:addr的长度
返回值:
成功:文件描述符,用于通信
失败:-1
【6】connect( )
#include
#include
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
功能:发送客户端的连接请求
参数:
sockfd:文件描述符,socket的返回值
addr:服务器网络信息结构体
addrlen:addr的长度
返回值:
成功:0
失败:-1