Linux下网络编程(1)创建客户端服务器

举报
DS小龙哥 发表于 2022/04/27 23:58:16 2022/04/27
【摘要】 本章节作为Linux下网络编程的基础,介绍Linux网络编程的框架、网络编程基础、完成服务器、客户端创健,完成基本数据收发、安装常用的编程软件。

虚拟机: 虚拟计算机环境、。

Linux系统编程需要掌握的知识:

1.​ 操作系统环境搭建(虚拟机+Linux操作系统)

2.​ 常用的指令(文件目录管理、网络管理、磁盘管理)

3.​ 文件(fopen系列、open系列)和目录操作

4.​ Shell脚本编程

5.​ 进程和线程编程(并发): 多路IO操作: poll机制、select机制、epoll机制

6.​ 网络编程

7.​ 常见的设备操作: 摄像头控制

学习Linux系统编程: Linux应用驱动开发、Linux运维开发。

任务1: Linux网络编程

1.1 协议概念介绍

网络传输分协议,底层常见协议: TCPUDP协议。

网络数据如何传输?

​协议词汇

IIC、SPI、CAN、485、8080、USART(串口)、TCP/IP协议…….

TCP/IP协议: 传输数据是分包进行发送。(数据包: 封包、解包)

问题: 有一个路由器可以上网(外网只有一根网线),路由器可以扩展网络(4根网线),4根网络同时接了4台电脑。

每台电脑在进行网络应用操作(QQ聊天、浏览器文件下载、玩游戏……)

端口号: 表示每一台电脑上的具体的一个应用程序。

IP地址: 表示每一个电脑的地址(唯一地址)。

访问一台电脑具体应用的地址表示方法: <IP地址>:<端口号> 192.168.1.123:8080


1.2 IP地址介绍

局域网IP地址: 常见都是192开头: 192.xx.xx.xx

广域网IP地址(公网IP): xx.xx.xx.xx 比如: 登录QQ。


1.3 TCP协议和UDP协议区别:

TCP协议: 点对点协议。 比如: 打电话 (3次握手过程)。

(HTTP协议、FTP协议……)

UDP协议: 广播协议。 比如: 广播电台。实时效率比较高。(数据不可靠


TCP协议模型: (C/S模型) (客户端+服务器模型)

TCP协议通信:是针对服务器客户端之间。

注意: 客户端和客户端不能直接通信、服务器和服务器直接不能直接通信。

电脑上的QQ软件: QQ客户端,服务器就在腾讯公司。

1.4 学习Linux系统基本网络操作指令

指令1: ifconfig <参数>

用法: ifconfig 查看已经启动的网卡信息(IP地址)。

1.​ 手动设置网卡IP地址: #ifconfig eth0 192.168.1.100

2.开启网卡: # ifup eth0

3. 关闭网卡: # ifdown eth0

4. 查看全部网卡: # ifconfig -a (包括关闭未启动的网卡)

5. 关闭防火墙的图形设置页面: # setup

1.5 网卡自动分配IP地址的操作


测试网络是否畅通:

1.6 常用的TCP协议调试软件使用

任务2: TCP协议网络编程

在Linux系统下所有的设备操作都可以看成文件操作

网络上传输的数据与本地计算机的数据传输存储的方式不一样: 小端和大端


TCP协议服务器搭建过程

1.​ 创建套接字: socket

2.​ 绑定端口号: bind (创建服务器)

3.​ 设置监听的数量,最大可以连接的客户端数量。

4.​ 阻塞方式等待客户端连接

5.​ 实现数据通信。 (客户端连接成功之后)


TCP协议客户端搭建过程

1.​ 创建套接字

2.​ 连接指定的服务器

3.​ 实现数据通信(成功的连接服务器)

​ 将16位数量从主机字节顺序转换为网络字节顺序。

# define HTONS(n) (u16_t)((((u16_t) (n)) << 8) | (((u16_t) (n)) >> 8))


作业

1.​ 重新编写代码,实现客户端与服务器之间基本通信。

#include <stdio.h>
#include <sys/types.h> 
#include <sys/socket.h>
#include <stdlib.h>
#include <arpa/inet.h>

/*
TCP客户端创建
*/
int main(int argc,char **argv)
{
	int tcp_client_fd; //客户端套接字描述符
	int Server_Port;    //服务器端口号
	struct sockaddr_in tcp_server; //存放服务器的IP地址信息
	char rx_buff[1024];
	int  rx_len;
	
	if(argc!=3)
	{
		printf("TCP客户端形参格式:./tcp_client <服务器IP地址>  <服务器端口号>\n");
		return -1;
	}
	
	Server_Port=atoi(argv[2]); //将字符串的端口号转为整型
	
	/*1. 创建网络套接字*/
	tcp_client_fd=socket(AF_INET,SOCK_STREAM,0);
	if(tcp_client_fd<0)
	{
		printf("TCP服务器端套接字创建失败!\n");
		return -1;
	}
	
	/*2. 连接到指定的服务器*/
	tcp_server.sin_family=AF_INET; //IPV4协议类型
	tcp_server.sin_port=htons(Server_Port);//端口号赋值,将本地字节序转为网络字节序
	tcp_server.sin_addr.s_addr=inet_addr(argv[1]); //IP地址赋值
	
	if(connect(tcp_client_fd,(const struct sockaddr*)&tcp_server,sizeof(const struct sockaddr))<0)
	{
		 printf("TCP客户端: 连接服务器失败!\n");
		 return -1;
	}
	
	/*3. 数据通信*/
	rx_len=read(tcp_client_fd,rx_buff,1024);
	printf("客户端接收的数据:%d,%s\n",rx_len,rx_buff);
	
	/*4. 关闭连接*/
	close(tcp_client_fd);
}

(2)创建服务器

#include <stdio.h>
#include <sys/types.h> 
#include <sys/socket.h>
#include <arpa/inet.h>
#include <stdlib.h>

/*
TCP服务器创建
*/
int main(int argc,char **argv)
{
	int tcp_server_fd; //服务器套接字描述符
	int tcp_client_fd; //客户端套接字描述符
	struct sockaddr_in tcp_server;
	struct sockaddr_in tcp_client;
	socklen_t tcp_client_addrlen=0;
	int tcp_server_port;  //服务器的端口号
	
	 //判断传入的参数是否合理
	if(argc!=2)
	{
		printf("参数格式:./tcp_server <端口号>\n");
		return -1;
	}		
	tcp_server_port=atoi(argv[1]); //将字符串转为整数
	
	/*1. 创建网络套接字*/
	tcp_server_fd=socket(AF_INET,SOCK_STREAM,0);
	if(tcp_server_fd<0)
	{
		printf("TCP服务器端套接字创建失败!\n");
		return -1;
	}
	
	/*2. 绑定端口号,创建服务器*/
	tcp_server.sin_family=AF_INET; //IPV4协议类型
	tcp_server.sin_port=htons(tcp_server_port);//端口号赋值,将本地字节序转为网络字节序
	tcp_server.sin_addr.s_addr=INADDR_ANY; //将本地IP地址赋值给结构体成员
	
	if(bind(tcp_server_fd,(const struct sockaddr*)&tcp_server,sizeof(struct sockaddr))<0)
	{
		printf("TCP服务器端口绑定失败!\n");
		return -1;
	}
	
	/*3. 设置监听的客户端数量*/
	listen(tcp_server_fd,10);
	
	/*4. 等待客户端连接*/
	tcp_client_addrlen=sizeof(struct sockaddr);
	tcp_client_fd=accept(tcp_server_fd,(struct sockaddr *)&tcp_client,&tcp_client_addrlen);
	if(tcp_client_fd<0)
	{
		printf("TCP服务器:等待客户端连接失败!\n");
		return -1;
	}
	
	//打印连接的客户端地址信息
	printf("已经连接的客户端信息: %s:%d\n",inet_ntoa(tcp_client.sin_addr),ntohs(tcp_client.sin_port));
	
	/*5. 数据通信*/
	write(tcp_client_fd,"123456789",10); //将数据发送给客户端
	
	/*6. 关闭连接*/
	close(tcp_client_fd);
}


2.​ 实现文件传输:

比如: 服务器给客户端发送文件 (下载)

客户端给服务器发送文件 (上传)

(1)​ 在本地计算机上测试

(2)​ 与局域网内其他计算机之间进行测试。 考虑网络、丢包问题。


扩展作业:

1.​ 实现目录传输(只写一级目录)。

2.​ 实现目录内文件的同步 (公交车站台、地铁里广告机(视频播放机))

安装编译器

解压命令: # tar xvf sublime_text_3_build_3143_x32.tar.bz2

在任意目录下想要运行这个编辑软件,需要添加环境变量。

1.​ # vim /etc/profile 打开配置文件 (翻到最后一行)


进入插入模式下,写上以下代码,再保存退出:

export PATH=/work/test/sublime_text_3:$PATH


2.​ 立即生效环境变量的命令(只是当前运行的终端有效)

# source /etc/profile


3.​ 永久生效。重启系统 或者 注销用户重新登录


第二个软件安装: # rpm -ivh UltraEdit-16.1-0.22.i386.rpm

使用软件: # uex 123.c

注册方法:

方法1(不改变软件配置):

UltraEdit for linux 30天无限试用的方法:

1. 查找uex.conf文件,该文件是UltraEdit的配置文件

示例:[root@wbyq sd_fuse]# find / -name uex.conf

查找出的结果:/root/.idm/uex/uex.conf


2. 删除uex.conf文件

示例:[root@wbyq sd_fuse]# rm /root/.idm/uex/uex.conf


3. 删除记录时间的文件

[root@wbyq ~]# rm /tmp/*.spl -rfdv


4. 重新运行uex命令即可使用



方法2(改变软件配置,全部重新初始化):

UltraEdit for linux 30天无限试用的方法:

1. 查找uex.conf文件,该文件是UltraEdit的配置文件

示例:[root@wbyq sd_fuse]# find / -name uex.conf

查找出的结果:/root/.idm/uex/uex.conf


2. 删除/root/.idm目录

示例:[root@wbyq sd_fuse]# rm /root/.idm -rf


3. 删除记录时间的文件

[root@wbyq ~]# rm /tmp -rf

4. 重新运行uex命令即可使用30天

方法3:

UltraEdit for linux 30天无限试用的方法:(快速精简,不改变之前的软件配置)

rm -rfd ~/.idm/uex

rm -rf ~/.idm/*.spl

rm -rf /tmp/*.spl

软件下载地址:

http://www.ultraedit.com/downloads/uex.html





【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。