Linux网络编程 搭建TCP通信流程

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 中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值