TCP

TCP编程

1、流程:

举个例子:

​ 买个手机,买张卡

​ 卡和手机需要匹配

​ 将手机和卡绑定

​ 设置为非飞行模式

​ 进行打电话

2、服务器:server.c

​ 创建套接字 socket( );填充服务器网络信息结构体 sockaddr_in;将套接字与服务器网络信息结构体绑定 bind( ) //固定服务器的信息,可以使得客户端连接;将套接字设置为被动监听状态 listen( );阻塞等待客户端的连接请求 accept( );进行通信 recv( )/send( )

3、客户端:client.c

​ 创建套接字 socket( );填充服务器网络信息结构体 sockaddr_in;发送客户端连接请求 connect( );进行通信 send( )/recv( )

4、函数原型

(1)sock()

(2)bind()

1)头文件

1
#include <sys/types.h> /* See NOTES */ #include <sys/socket.h>

2)函数原型

1
2
3
4
5
6
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
功能:将套接字与网络信息结构体绑定
参数:
sockfd:文件描述符,socket的返回值
addr:网络信息结构体
addrlen 地址长度

通用的(一般不用)

1
2
3
4
5
6
7
struct sockaddr {
sa_family_t sa_family;
char sa_data[14];
}

网络信息结构体:sockaddr_in

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <netinet/in.h>
struct sockaddr_in
{
u_short sin_family; // 地址族, AF_INET,2 bytes
u_short sin_port; // 端口号,2 bytes
struct in_addr sin_addr;
struct in_addr {
in_addr_t s_addr; // IPV4地址,4 bytes
};
char sin_zero[8]; // 8 bytes unused,作为填充
};
返回值:
成功:0
失败:-1

(3)listen()

1)头文件

1
#include <sys/types.h> /* See NOTES */ #include <sys/socket.h>

2)函数原型

1
2
3
4
5
6
7
8
int listen(int sockfd, int backlog);
功能:将套接字设置为被动监听状态
参数:
sockfd:文件描述符,socket的返回值
backlog:允许同时响应客户端请求的个数,一般为5、10
返回值:
成功:0
失败:-1

(4) accept()

1)头文件

1
2
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>

2)函数原型

1
2
3
4
5
6
7
8
9
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
功能:阻塞等待客户端的连接请求
参数:
sockfd:文件描述符,socket的返回值
addr:被填充的网络信息结构体(获取到的客户端的信息)
addrlen:addr的长度
返回值:
成功:新的文件描述符(与对应的客户端进行通信)
失败:-1

(5)connect()

1)头文件

1
2
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>

2)函数原型

1
2
3
4
5
6
7
8
9
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
功能:发送客户端的连接请求
参数:
sockfd:文件描述符,socket的返回值
addr:服务器网络信息结构体(自己填充)
addrlen:addr的长度
返回值:
成功:0
失败:-1

(6) send()

1)头文件

1
2
#include <sys/types.h>
#include <sys/socket.h>

2)函数原型

1
2
3
4
5
6
7
8
9
10
11
12
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
功能:发送数据
参数:
sockfd:文件描述符
服务器端:accept的返回值
客户端:socket的返回值
buf:发送的数据
len:buf的长度
flags:标志位,一般为0
返回值:
成功:发送的数据的长度
失败:-1

(7) recv()

1)头文件

1
2
#include <sys/types.h>
#include <sys/socket.h>

2)函数原型

1
2
3
4
5
6
7
8
9
10
11
12
13
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
功能:接收数据
参数:
sockfd:文件描述符
服务器端:accept的返回值
客户端:socket的返回值
buf:接收的数据
len:buf的长度
flags:标志位,一般为0
返回值:
成功:接收的数据的长度
失败:-1
0 发送方关闭文件描述符或者退出