Linux开发_网络编程基础(1)

举报
DS小龙哥 发表于 2022/05/23 23:11:20 2022/05/23
【摘要】 补充进程通信的知识点,介绍网络编程基础,完成服务器、客户端创建,实现服务器与客户端之间的基本通信。

任务1:进程

(1)​ 进程的创建和管理

(2)​ 命名管道与无名管道基本运用

(3)​ 信号的接收和发送(闹钟的信号)

#include <stdio.h>
#include <signal.h>

/*信号处理函数*/
void sighandler(int signal_num)
{
	alarm(1);
	printf("SIGNAL:%d\n",signal_num);
}

int main(int argc,char **argv)
{
	/*绑定信号到特定的函数*/
	signal(SIGALRM,sighandler);
	alarm(1); //设置闹钟
	while(1)
	{
		
	}
	return 0;
}

需求:通过C语言代码获取其他进程(c语言代码、Shell脚本)的返回值。

(1)​ system(“ls -l >123.txt”); //重定向输出

(2)​ popen标准管道;

#include <stdio.h>

FILE *popen(const char *command, const char *type);

参数解析:

const char *command:就是需要执行的命令,就是可执行程序。例如: “ls -l” “./a.out”

const char *type: “w”写 “r”读


int pclose(FILE *stream);


无名管道:

fds[0] 表示读

fds[1] 表示写

int dup2(int oldfd, int newfd); //实现文件描述符的重定向

示例: dup2(fds[1],1); //将本程序的标准输出定义到管道的写端

标准输入:0

标准输出:1

标准错误:2

FIFO文件是否可以在创建? 不可在挂载的目录下创建。


任务2:网络编程

管道: 运用多个进程之间的通信。

socket网络编程:运用于多个设备之间通信。

Socket网络编程实际对TCP/IP协议进行编程。

TCP/IP协议:

底层协议:TCP\UDP

上层协议:HTTP、FTP、NFS……..

​ 学习网络编程需要了解的概念:

1.​ 能够传输网络数据的方式: 以太网有线网卡、无线网卡WIFI

2.​ 了解网络协议:如何区分数据是发给谁的。

3.​ IP地址:同一个局域网内,每台电脑的IP地址不一样。

IP地址:区分每台电脑。

4.​ 端口号:同一个电脑内,区分不同的应用程序。

192.168.1.18:8585

5. TCP协议:点对点协议(打电话),数据丢包会自动重发,传输比较稳定。

TCP协议有3次握手的过程,建立通信的基础。

一般适用于:FTP文件传输、HTTP网页数据传输等等…….

TCP协议通信中区分服务器与客户端:

服务器必须先存在,客户端才可以连接。(网络游戏)

客户端与客户端之间可以通信?必须通过服务器—模式就是(C/S)

5.​ UDP协议:广播方式协议(上课一样)。

特性就是:实时性

一般适用于:视频传输、视频监控…..QQ视频

UDP协议不区分服务器与客户端,发送数据的就是服务器,接收数据的就是客户端。

6.​ 数据的大小端模式。电脑上的数据一般都是小端模式,网络数据大端模式。

7.​ Socket编程与文件操作原理是一样。一切皆文件!

​ TCP服务器创建流程

1.​ 调用socket函数创建网络通信套接字(用法与open类似)。

2.​ 调用bind绑定端口的函数(填充必须要结构体成员),创建服务器。

3.​ 设置监听端口的数量(设置最大能够连接的客户端数量)

4.​ 调用accept等待

5.​ 调用read或者write函数进行基本通信


​ TCP客户端创建流程

1.​ 调用socket函数创建网络通信套接字(用法与open类似)。

2.​ 调用Connect函数连接指定的服务器

3.​ 调用read或者write函数进行基本通信


​ 练习

1.​ 实现服务器与客户端之间的基本通信,收发数据

客户端:

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

/*
TCP服务器:
1. sockt创建套接字
2. bind绑定端口
3. 设置监听的数量
4. 等待客户端连接
*/
int socket_sfd; /*保存了服务器端的套接字*/
int socket_cfd; /*已经连接成功的客户端套接字*/

int main(int argc,char **argv)
{
	if(argc!=3)
	{
		printf("./server <192.168.xx.xx 本地IP地址> <服务器端口号>\n");
		exit(-1);
	}
	
	int err; //存放返回值状态
	/*1. 创建套接字*/
	socket_sfd=socket(AF_INET,SOCK_STREAM,0);
	if(socket_sfd<0)
	{
		printf("服务器端创建失败!\n");
		exit(-1);
	}
	
	/*2. 绑定端口*/
	struct sockaddr_in ServerAddr;
	ServerAddr.sin_family=AF_INET; //IPV4协议
	ServerAddr.sin_port=htons(atoi(argv[2]));      //服务器的端口号 最大值65535
	ServerAddr.sin_addr.s_addr=inet_addr(argv[1]); //IP地址赋值
	err=bind(socket_sfd,(const struct sockaddr *)&ServerAddr,sizeof(struct sockaddr));
	if(err!=0)
	{
		printf("服务器端 端口绑定失败!\n");
		exit(-1);
	}
	
	/*3. 设置监听的数量*/
	listen(socket_sfd,10);
	
	/*4. 等待客户端连接*/
	struct sockaddr_in ClientAddr; //存放已经连接成功客户端信息
	socklen_t addrlen=sizeof(struct sockaddr);    //客户端的地址长度
	socket_cfd=accept(socket_sfd,(struct sockaddr *)&ClientAddr,&addrlen);
	if(socket_cfd<0)
	{
		printf("服务器端,连接客户端失败!\r\n");
		exit(-1);
	}
	
	/*打印一些客户端的信息*/
	printf("成功连接的客户端端口号:%d\n",ntohs(ClientAddr.sin_port));
	printf("成功连接的客户端IP地址:%s\n",inet_ntoa(ClientAddr.sin_addr));
	
	/*5. 收发数据 :服务器给客户端发送10个字节的数据*/
	err=write(socket_cfd,"123456789",10);
	printf("服务器成功发送:%d 字节\r\n",err);
	return 0;
}


2.​ 实现服务器与客户端之间的文件传输。(单个文件传输)



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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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