{C++基础} UNIX高级编程 day13 网络基础 ,基于tcp的网络编程
in C/C++ with 0 comment

{C++基础} UNIX高级编程 day13 网络基础 ,基于tcp的网络编程

in C/C++ with 0 comment

复习

一,进程间通讯 system V ipc

* 消息队列
* 共享内存

二,网络基础

1,TCP/IP协议分层
应用层,传输层,网络层,链路层
2,网络通讯中 的地址
Ip地址 Mac地址

一,网络基础

端口号: 每一个应用程序都监听一个端口。通过端口,可以找到为客户提供服务的应用程序。0~65535 5000以下服务。

要实现网络通讯。IP地址和端口号 通讯对
IP分类
IP的构成两部分 网络号 主机号
0~127 10
128~191 172
192~223 192

IP地址分为私有IP和公有IP

如果给定一个ip地址,如何获取这个ip地址的网络号?
子网掩码

主机号全0 代表网络号
主机号全1 代表局域网广播地址

集线器 HUB 工作在物理层

交换机 交换的是网帧 工作在链路层

路由器 交换的是ip数据报 工作在网络层

测试两台机器是否互通 ping

二,基于TCP的网络传输

TCP是网络的传输层。是面向连接的,面向数据流的。

基于TCP协议的客户端和服务器端编程基础

1,创建一个socket()通讯端点。(通讯设备)

Socket(2)

#include <sys/socket.h>
 int     socket(int domain, int type, int protocol);

功能:创建一个通讯端点。
参数
Domain: AF_INET(ipv4). AF_INET6(ipv6)
Type:
SOCK_STREM. (顺序的,可靠的,连接的,双向的,面向数据流的)
SOCK_DGRAM(无需连接,不可靠的数据传输,面向数据包的)
Protocol: 0
返回值
错误 -1 errno被设置
成功 返回一个新的文件描述符

2,将socket()通讯端点和服务器的IP地址和端口号绑定

Bind(2)

#include <sys/socket.h>
int     bind(int socket, const struct sockaddr *address, socklen_t address_len);

功能
参数:
Sockefd:指定了通讯端点
Addr:指定了服务器的ip地址和端口号
Addrlen:指定了addr的结构体的空间大小

返回值
成功: 0
错误 : -1 errno被设置

    struct    sockaddr{
        Sa_family_t    sa_family;
        char    sa_data[14];
    }

3,设置通讯端点为被动接收连接,将连接自己的客户端的连接放入一个队列中。未决连接队列
listen(2)

#include <sys/socket.h>
int.  listen(int socket, int backlog);

功能:将文件描述符标记为被动连接
参数
Socket:被标记为被动的sockfd。后边用于accept(2)
Backlog:未决连接的最大值
返回值
成功: 0
错误: -1 errno被设置

4,如果未决连接队列为空,阻塞等待客户端连接的到来。如果不为空,从未决连接队列中取出一个连接,进行处理。返回一个和客户端的连接描述符。(conn_fd)

        `Accept(2)`
#include <sys/socket.h>
int     accept(int socket, struct sockaddr *restrict address, socklen_t *restrict address_len);

功能:处理一个socket上的连接。
参数
Socks:指定了socket
Addr: 指定了存放客户端信息的地址。具体的是什么家族类型的然后取决于socket(2)类型选择。
Addrlen:如果addr置空,那么这个参数也被置为NULL。
如果addr不为NULL,那么addrlen设置为addr尺寸的变量的地址。
返回值
-1 错误 errno被设置
成功 返回一个文件描述符,(这个文件描述符是和客户端的连接。)

值-结果参数

5,使用conn_fd和客户端进行通讯。获取客户端的数据

Read(2)

6,处理获取到的数据

7,向客户端发送处理结果。

Write(2)

8,关闭连接,结束本次服务。

Close(2)

9,继续到第4步循环

基于TCP的客户端编程步骤。

1,创建socket()通讯端点。

Socket(2)

2,发起连接,连接服务器

Connect(2)

 #include <sys/types.h>
     #include <sys/socket.h>
int     connect(int socket, const struct sockaddr *address, socklen_t address_len);

功能:在指定的socket上发起一个连接。
参数
Socket:指定了socket
Addr:指定了服务器的地址和端口
Addrlen:指定了addr的长度,具体的addr取决于soket的地址家族类型
返回值
错误 -1 errno被设置
成功 0

3,向服务器发送请求

Write(2)

4,阻塞等待服务器的响应信息。

5,客户端对服务器的响应信息进行处理。

6,结束向服务器的请求。结束和服务器的通讯

举例:

编写代码实现基于tcp的服务器端编程

1 #include<stdio.h>
  2 #include<sys/types.h>
  3 #include<sys/socket.h>
  4 #include<ctype.h>
  5 #include<unistd.h>
  6 int main(){
  7         struct sockaddr addr;
  8         char buf[128];
  9         //创建一个通讯设备
 10         int s_fd,conn_fd;
 11         s_fd=socket(AF_INET,SOCK_STREAM,0);
 12         if(s_fd==-1){
 13                 perror("socket");
 14                 return -1;
 15         }
 16         //将通讯设备和服务器的地址和端口号绑定
 17         int b= bind(s_fd,&addr,sizeof(addr));
 18         if(b==-1){
 19                 perror("bind");
 20                 return -1;
 21         }
 22         //将s_fd设置为被动连接
 23         listen(s_fd,5);
 24         while(1){//在循环中,从未决连接队列中取出一个连接进行处理。
 25                 conn_fd = accept(s_fd,NULL,NULL);
 26                 if(conn_fd==-1){
 27                         perror("accept");
 28                         return -1;
 29                 }
 30                 //已经和客户端建立连接
 31                 //读取客户端的请求信息
 32                 int r = read(conn_fd,buf,128);
 33                 //处理客户端的请求for(int i=0;i<r;i++){
 35                         buf[i]=toupper(buf[i]);
 36                 }
 37                 //响应客户端
 38                 write(conn_fd,buf,r);
 39                 //关闭和客户端的连接
 40                 close(conn_fd);
 41         }
 42         return 0;
 43 }

客户端:

1 #include<stdio.h>
  2 #include<sys/types.h>
  3 #include<sys/socket.h>
  4 #include<string.h>
  5 #include<unistd.h>
  6 int main(){
  7         char buf[128];
  8         struct sockaddr serv;
  9         char* msg = "this is a test!\n";
 10         //创建一个socket
 11         int s_fd;
 12         s_fd=socket(AF_INET,SOCK_STREAM,0);
 13         if(s_fd == -1){
 14                 perror("socket");
 15                 return -1;
 16         }
 17         //连接s_fd到服务器的ip地址和端口号
 18         int c=connect(s_fd,&serv,sizeof(serv));
 19         if(c==-1){
 20                 perror("connect");
 21                 return -1;
 22         }
 23         //向服务器发送消息
 24         write(s_fd,msg,strlen(msg));
 25         //阻塞等待服务器的响应消息
 26         int r = read(s_fd,buf,128);
 27         //将获取到的响应信息输出到显示器
 28         write(1,buf,r);
 29         //中止本次通讯
 30         close(s_fd);
 31         return 0;
 32 }

总结

一,网络基础
1,子网掩码
2,集线器 交换机 路由器
3,路由器 arp表
4,三次握手 四次握手
二,基于tcp的网络编程 主题框架

Responses