TCP客服端的搭建流程
1.创建tcp通信socket函数接口
int socket(int domain ,int type ,int protocol);
参数一 :网络层协议 AF_INET IPV4 Internet protocols
参数二 :传输层协议 SOCK_STREAM 数据流 TCP
SOCK_DGRAM 数据报 DUP
参数三 :属性 默认为 0
return value :成功返回 new socket ( 新的网络文件描述符) 失败返回 error -1
2.设置服务器信息
#include <linux/in.h> 服务器信息结构体头文件
在linux终端环境下查看服务器信息结构体 命令 :gedit /usr/include/linux/in.h
/* Structure describing an Internet (IP) socket address. */
结构体描述一个网络的socket地址
struct sockaddr_in {
__kernel_sa_family_tsin_family;/*地址协议族 网络层协议*/
__be16sin_port;/*端口号*/ /*尽量使用100以后的端口,因为1000以前有可能被系统占用着*/
struct in_addrsin_addr;/*网络IP地址*/
}
/*/网络IP地址/
struct in_addr {
__be32s_addr;
};
---------------IP地址转换函数--------------
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
in_addr_t inet_addr(const char *cp); //把字符串类型的IP地址转换成整形
char *inet_ntoa(struct in_addr in); //把整形的IP地址转换成字符串类型
ip地址一般形式是字符串,需要成整形计算机识别
-----------大小端的转换---------------
注意:网络通信都是使用大端格式通信的,目的是为了数据的完整性
#include <arpa/inet.h>
uint16_t htons(uint16_t hostshort); //本地序 -》 网络序
uint16_t ntohs(uint16_t netshort);//网络序 -》 本地序
3.链接到网络服务器中
NAME
connect - initiate a connection on a socket
SYNOPSIS
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
参数一:int sockfd 需要链接的网络描述符
参数二: const strunct sockaddr *addr 服务器的IP地址信息 (结构体描述的socke地址)
参数三:socklen_t addrlen 服务器IP地址信息的大小 (结构体的大小)
返回值: 0 成功 -1 失败
4.进行数据的读写 read/write
socket网络描述符和普通的网络描述副一样,也可以进行读写操作,
当然,写入的信息是传递给另外一个IP主机的,读取则是接受其反馈信息
从而利用读写操作进行通信。
1)当读取网络通信描述符时没有数据的话 读 会阻塞
2)当写不断的往网络通信描述符写入数据没有人去读取数据时, 写满 则阻塞
3)当建立通信后,某一方端口断开链接,我们的读操作就不会阻塞。
5.关闭通信
TCP 通信中的服务器端的搭建流程
1.创建tcp通信socket
创建通信socke获取网络描述符和客户端操作一样
2.绑定本地网络中服务器的信息
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
参数一:需要绑定的服务器socket
参数二:服务器的IP地址信息
参数三:服务器的IP地址信息的大小
返回值:成功 0 失败 -1
/* Address to accept any incoming messages.*/
万用IP地址,让服务器自动监听并绑定本地网卡地址
IP地址设计0.0.0.0系统会自动检测本地IP
#defineINADDR_ANY((unsigned long int) 0x00000000)
3.设置为监听模式
把服务端设置为监听模式,等待客服端链接信息的来临,并接受其信息
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
int listen(int sockfd, int backlog);
参数一:需要监听服务socket
参数二:最大监听数 (同时可以接受多少个链接请)
返回值: 成功 0 失败 -1
4.接受对方的链接请求
(当没有客户端链接进来时accept或阻塞,直到到有客户链接进来为止)
NAME
accept - accept a connection on a socket
SYNOPSIS
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
参数一:已经为监听模式服务器socket
参数二:对方的IP地址信息 (需要定义一个结构体来接受ip地址信息)
参数三:成功保存对方信息的大小
返回值: 成功 accepted socket (接收客户端网络描述符) 失败 -1
这样我们就搭建好客服端和服务端了,两者之间经过三次握手就可以进程网络通信了,值得我们注意的是,三次握手发生在connect 中。