day35 ------TCP协议,共享内存练习

1.共享内存练习,一个进程发数据,一个打印

c 复制代码
**写进程**
#include <stdio.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <signal.h>
#include <string.h>

int main(int argc,char *argv[])
{
    key_t key = ftok("./",'!');//创建共享内存唯一key值(第一个是存放的地址,第二个是代号,任意ascII码)
    if(key < 0)
    {
        perror("fail ftok");
        return -1;
    }

    int shmid = shmget(key , 4096,IPC_CREAT|0664);//创建共享内存,大小,权限,返回共享内存
    if(shmid < 0)
    {
        perror("fail shmget");
        return -1;
    }

    void *pmem = shmat(shmid , NULL , !SHM_RDONLY);//将共享内存空间与用户空间建立映射关系
    if((void *)-1 == pmem)
    {
        perror("fail shmat");
        return -1;
    }

    char buff [1024] = {0};
    pid_t otherpid = *((pid_t *)pmem);//接收pid转为pid类型
    
    while(1)
    {
        fgets(buff,sizeof(buff),stdin);//fgets在\n后家\0;
        strcpy((char *)pmem,buff);//写道用户内存,等于到共享内存
        kill(otherpid,SIGUSR1);//不知道神魔时候写入数据所以要发信号
    }


    shmdt(pmem);//解除映射
    //shmctl(shmid,IPC_RMID,NULL);


**读进程**一定要先运行读端口
#include <stdio.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <unistd.h>
#include <signal.h>


void *pmem = NULL;
void printf_data(int signo)
{
    printf("%s\n",(char*)pmem);
}


int main(int argc,char *argv[])
{
    signal(SIGUSR1,printf_data);//接受信号去打印;
    key_t key = ftok("./",'!');//创建共享内存唯一key值(第一个是存放的地址,第二个是代号,任意ascII码)
    if(key < 0)
    {
        perror("fail ftok");
        return -1;
    }

    int shmid = shmget(key , 4096,IPC_CREAT|0664);//创建共享内存,大小,权限,返回共享内存
    if(shmid < 0)
    {
        perror("fail shmget");
        return -1;
    }

    pmem = shmat(shmid , NULL , !SHM_RDONLY);//将共享内存空间与用户空间建立映射关系
    if((void *)-1 == pmem)
    {
        perror("fail shmat");
        return -1;
    }

    pid_t pid = getpid();//获得自己的pid,传到用户内存上
    *((pid_t *)pmem) = pid;//转为pid类先发过去
    
    while(1)
    {
       // pause();
    }


    shmdt(pmem);//解除映射
    //shmctl(shmid,IPC_RMID,NULL);
}

}

2.TCP协议

c 复制代码
TCP : 传输控制协议   传输层

1. TCP特点:
	1.面向连接
	2.安全、可靠
	3.面向字节流
	4.占用资源开销大

	三次握手:
		指建立tcp连接时,需要客户端和服务端总共发送三次报文确认连接。
	四次挥手:
	    断开一个tcp连接,需要客户端和服务端发送四个报文以确认断开。

也可以三次挥手,但是要确保二三次之间没有数据传输

c 复制代码
1.框架

   client: socket--->connect--->send/write--->close
   server:	socket--->bind--->listen--->accept---> recv/read--->close
	
2. 函数接口:
	1.socket
	  socket(AF_INET, SOCK_STREAM, 0);
	
	2.connect(客户端)
	  int connect(int sockfd, const struct sockaddr *addr,
                   socklen_t addrlen);
	  功能:
		发送三次握手链接请求
	  参数:
		sockfd:套接字文件描述符
		addr:存放目的地址空间首地址
		addrlen:目的地址长度
	  返回值:
		成功返回0 
		失败返回-1 
		
	3.send
	  ssize_t send(int sockfd, const void *buf, size_t len, int flags);
	  功能:
		发送数据
	  参数:
		sockfd:套接字文件描述符
		buf:存放数据空间首地址
		len:数据长度
		flag:属性默认为0 
	  返回值:
		成功返回发送字节数
		失败返回-1 
		
	4.recv
	  ssize_t recv(int sockfd, void *buf, size_t len, int flags);
	  功能:
		接收数据 
	  参数:
		sockfd:套接字文件描述符
		buf:存放数据空间首地址 
		len:最多接收数据长度 
		flags:接收属性默认为0 
	  返回值:
		成功返回实际接收字节数
		失败返回-1 
		连接断开返回0 

	5.bind(服务端)(服务)
	  int bind(int sockfd, const struct sockaddr *addr,
                socklen_t addrlen);

	6.listen(服务)
	  int listen(int sockfd, int backlog);
	  功能:
		监听三次握手链接请求
	  参数:
		sockfd:套接字文件描述符
		backlog:最多允许等待尚未处理的三次握手链接个数
	  返回值:
		成功返回0 
		失败返回-1 

	10.accept(服务)
	   int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
	   功能:
		  处理三次握手等待队列中的第一个请求并建立一个用来通信的新套接字
	   参数:
		  sockfd:套接字文件描述符
		  addr:存放发送端IP地址空间首地址 
		  addrlen:想要接收的IP地址的长度 
	   返回值:
		  成功返回新文件描述符
		  失败返回-1 
相关推荐
SunTecTec19 分钟前
Linux grep -r 查找依赖包是否存在依赖类 Class
linux·运维·服务器
Johny_Zhao1 小时前
AI+自动化测试系统方案:网络设备与网络应用智能测试
linux·网络·人工智能·python·网络安全·docker·ai·信息安全·云计算·ansible·shell·cisco·huawei·系统运维·itsm·华三·deepseek
XQ丶YTY2 小时前
TCP/UDP协议原理和区别 笔记
笔记·tcp/ip·udp
猴子请来的逗比4892 小时前
tomcat查看状态页及调优信息
服务器·学习·tomcat·firefox
带鱼吃猫3 小时前
Linux系统:ext2文件系统的核心概念和结构
linux·运维·服务器
qwer555883 小时前
linux-----------------库制作与原理(下)
linux·运维·服务器
m0_519523103 小时前
Linux——UDP/TCP协议理论
linux·tcp/ip·udp
vortex53 小时前
Bash fork 炸弹 —— :(){ :|:& };:
运维·服务器·开发语言·网络安全·bash
Blossom.1184 小时前
基于区块链技术的供应链溯源系统:重塑信任与透明度
服务器·网络·人工智能·目标检测·机器学习·计算机视觉·区块链
冷崖4 小时前
网络编程-select(二)
网络·学习