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 发送方关闭文件描述符或者退出
|