首页 > 系统相关 >linux 2 网络基础

linux 2 网络基础

时间:2023-07-31 15:57:55浏览次数:28  
标签:info addr int 基础 网络 linux include buf port

1.包裹函数

对服务器客户端等函数进行报错处理 以及简化处理

比如bind

int tcp4bind(short port,const char *IP)
{
    struct sockaddr_in serv_addr;
    int lfd = Socket(AF_INET,SOCK_STREAM,0);
    bzero(&serv_addr,sizeof(serv_addr));
    if(IP == NULL){
        //如果这样使用 0.0.0.0,任意ip将可以连接
        serv_addr.sin_addr.s_addr = INADDR_ANY;
    }else{
        if(inet_pton(AF_INET,IP,&serv_addr.sin_addr.s_addr) <= 0){
            perror(IP);//转换失败
            exit(1);
        }
    }
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_port   = htons(port);
   // int opt = 1;
	//setsockopt(lfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));

    Bind(lfd,(struct sockaddr *)&serv_addr,sizeof(serv_addr));
    return lfd;
}


2.粘包

缓冲区内 由于没发送完毕另外一个包就来了直接挤占前一个包的缓冲区(被信号打断的情况

粘包

解决方式
1.约定 一次发送固定字节数
2.数据结尾要\n
3.头部加上数据的大小

3.三次握手规则

三次握手规则

SYN 包体中的1

4.四次挥手

四次挥手

FIN

四次握手序号

四次握手序号

5.滑动窗口

mms

mms

mss 出现三次握手前两次 告知对方发送数据最大长度
MTU 跟网卡有关系 一帧最大传输单元

6.TCP流量控制

TCP报文窗口尺寸 发送报文者的最大缓冲区

流量控制

三次握手第2次告诉
发送流程

数据读取流程

7.多进程(多线程)实现并发服务器

多进程服务器

创建套接字

绑定

监听

while(1)

{

提取连接

fork创建子进程

子进程中,关闭lfd,服务客户端

​ 父进程关闭cfd,回收子进程的资源

}

关闭

并发是指两个或多个事件在同一时间间隔内发生

代码

#include<unistd.h>
#include<stdio.h>
#include<arpa/inet.h>
#include<sys/socket.h>
#include<string.h>
#include<stdlib.h>
#include<sys/wait.h>
#include<signal.h>
#include"wrap.h"
void free_process(int sig)
{
	pid_t pid;
	while (1)
	{
		pid = waitpid(-1, NULL, WNOHANG);
		if (pid <= 0)
		{
			break;
		}
		else
		{
			printf("进程号%d 退出\n", pid);
		}
	}

}
int main()
{
	//TCP bind ipv44
	sigset_t set;
	sigemptyset(&set);
	sigaddset(&set, SIGCHLD);
	sigprocmask(SIG_BLOCK, &set, NULL);

	int lfd = tcp4bind(8000, NULL);
	Listen(lfd, 128);
	struct sockaddr_in as;
	socklen_t  len = sizeof(as);
	while (1)
	{

		char ip[16] = "";
		int cfd = Accept(lfd, (struct sockaddr*)&as, &len);
		printf("新的主机 ip=%s port=%d \n", inet_ntop(AF_INET, &as.sin_addr.s_addr, ip, 16), ntohs(as.sin_port));
		pid_t pid;
		pid = fork();
		if (pid < 0)
		{
			perror("fork");
			exit(0);
		}
		else if (pid == 0)
		{
			while (1)
			{
				//字进程内部
				close(lfd);
				char buf[1024] = "";
				int n = read(cfd, buf, sizeof(buf));
				if (n < 0)
				{
					perror("");
					close(cfd);
					exit(0);
				}
				else if (0 == n)
				{
					printf("主机 ip=%s port=%d  即将断开链接 \n", inet_ntop(AF_INET, &as.sin_addr.s_addr, ip, 16), ntohs(as.sin_port));
					close(cfd);
					exit(0);
				}
				else
				{
					printf("%s\n", buf);
					write(cfd, buf, n);
				}
			}

		}
		else
		{
			//父进程
			close(cfd);
			//拦截子进程退出信号 进程资源回收
			struct sigaction act;
			act.sa_flags = 0;
			act.sa_handler = free_process;
			//清空阻塞集
			sigemptyset(&act.sa_mask);
			//注册
			sigaction(SIGCHLD, &act, NULL);
			//解除阻塞
			sigprocmask(SIG_UNBLOCK, &set, NULL);
		}

		
	}
	return 0;
}
多线程实现并发服务器
#include<unistd.h>
#include<stdio.h>
#include<arpa/inet.h>
#include<sys/socket.h>
#include<string.h>
#include<stdlib.h>
#include<sys/wait.h>
#include<signal.h>
#include"wrap.h"
#include <pthread.h>

typedef struct agv1
{
	struct sockaddr_in cliaddr;
	int cdf;

}agv1;

void* fun(void *arg)
{
	agv1* info = (agv1*)arg;
	//打印信息
	char ip[16] = "";
	printf("客户端 ip=%s port=%d  链接 \n", inet_ntop(AF_INET, &(info->cliaddr.sin_addr.s_addr), ip, 16),
		ntohs(info->cliaddr.sin_port));
	while (1)
	{
		char buf[1024] = "";
		int count = 0;
		count = read(info->cdf, buf, sizeof(buf));
		if (count == 0)
		{
			printf("客户端 ip=%s port=%d  链接即将断开 线程即将销毁 \n", inet_ntop(AF_INET, &(info->cliaddr.sin_addr.s_addr), ip, 16),
				ntohs(info->cliaddr.sin_port));
				break;
				break;
		}
		else
		{
			printf("客户端%d : %s\n",ntohs(info->cliaddr.sin_port) ,buf);
		}

	}
	close(info->cdf);
	free(info);
	//线程设置分离 自动回收

}

int main()
{

	printf("请输入服务器端口号\n");
char buf[8] = "";
	
	read(STDIN_FILENO, buf, sizeof(buf));
	printf("   \n");
printf("等待客户端链接\n");
int port = atoi((char*)buf);
int G=9;
	if(G==9)
{
	//创建 绑定
	int lfd=tcp4bind(port, NULL);
	//监听
	Listen(lfd, 128);
	//提取
	struct sockaddr_in as;
	socklen_t  len = sizeof(as);
	agv1* info;
	pthread_attr_t attr;
	pthread_attr_init(&attr);
	pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
	while (1)
	{
		
		pthread_t pthid;
		int cfd = Accept(lfd, (struct sockaddr*) & as, &len);
		//创建线程 ->传递参数
		info = malloc(sizeof(agv1));
		info->cdf = cfd;
		info->cliaddr = as;
		//创建线程

		pthread_create(&pthid, &attr, fun, info);

	}

}
}

标签:info,addr,int,基础,网络,linux,include,buf,port
From: https://www.cnblogs.com/lzfyz/p/17593643.html

相关文章

  • linux 8 基于线程池和epoll监听实现聊天服务器
    1.立项功能1.聊天总人数显示2.账号密码注册功能-保留名字-永久保留id->保留id功能取消3.总聊天室-进入前可输入名字顺序id4.聊天室聊天5.单对单聊天6.id=cfd串联起来4.服务器代码#include"threadpoolsimple.h"//初始化结构体#include<stdio.h>ThreadPool*thrPool=......
  • Linux文件系统与日志分析
    目录Linux文件系统与日志分析日志是解决问题的唯一手段1.inode表结构1.1元数据1.2inode内容1.3inode内容1.4目录文件的结构1.5inode的号码1.6恢复XFS类型的文件2.日志服务管理2.1系统日志介绍2.2rsyslog系统日志服务2.3rsyslog日志管理2.3.1系统日志术语2.4日志文件2.......
  • linux的hw_breakpoint
    参考:https://martin.uy/blog/hardware-breakpoints-in-the-linux-kernel-through-perf_events/https://www.cnblogs.com/sunkang/archive/2011/05/04/2038816.htmlhttps://www.cnblogs.com/hellokitty2/p/16212629.htmlhttps://blog.csdn.net/shenhuxi_yu/article/details/......
  • Linux集群监控部署: prometheus 普罗米修斯 + Grafana
    前言之前我们有用到top、free、iostat等等命令,去监控服务器的性能,但是这些命令,我们只针对单台服务器进行监控,通常我们线上都是一个集群的项目,难道我们需要每一台服务器都去敲命令监控吗?这样显然不是符合逻辑的,Linux中就提供了一个集群监控工具–prometheus。prometheus监......
  • Linux fdisk command All In One
    LinuxfdiskcommandAllInOnediskpartition/磁盘分区$fdisk-hUsage:fdisk[options]<disk>changepartitiontablefdisk[options]-l[<disk>...]listpartitiontable(s)Displayormanipulateadiskpartitiontable.Options:......
  • linux环境中,如何查看网络设备的序列号?
    通过iplink查看网络设备的序列号 iplink  查询结果中,最左边的一列,就是这个网络接口,在主机上的序列号。......
  • 微机原理基础知识
    前言微机原理期末复习的一些概念性的基础知识总结。内容(1)微处理器、微机与微机系统三者之间有什么异同?(1)把CPU(运算器和控制器)用大规模集成电路技术做在一个芯片上,即为微处理器。(2)微处理器加上一定数量的存储器和外部设备(或外部设备接口)构成了微型计算机(也就是微机)。(3)微型计算机与......
  • 字符串基础
    几乎所有字符串算法都存在一个共性:基于所求信息的特殊性质与已经求出的信息,使用增量法与势能分析求得所有信息。这体现了动态规划思想。Manacher很好地证明了这一点:它维护所求得的最右回文子串的回文中心\(d\)与回文半径\(r\),利用回文性质通过均摊右端点移动距离在线性时间内......
  • 使用 ARACNE 方法和合成数据集重建基因调控网络
     在生物信息学中,基因调控网络的重建是一个重要的研究领域。这种网络可以揭示基因之间的相互作用,帮助我们理解生物系统的复杂性。在本文中,我将介绍如何使用ARACNE方法和合成数据集来重建基因调控网络。##ARACNE方法ARACNE(AlgorithmfortheReconstructionofAccurateCel......
  • CoaXPress 2.0 FPGA HOST IP Core Linux Demo
      目录Hello-FPGACoaXPress2.0HostFPGAIPCoreLinuxDemo41说明42设备连接73VIVADOFPGA工程74调试说明10图1‑1资料目录4图1‑2VIVADO工程目录结构5图1‑3SDK工程目录结构5图1‑4设备树信息6图1‑5petalinux应用程序6图2‑1ZCU10......