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 
相关推荐
gihigo19983 小时前
高效微逆变器设计:程序实现与上位机监控系统
网络
北 染 星 辰5 小时前
无源光网络-PON
网络
WiChP5 小时前
【V0.1B5】从零开始的2D游戏引擎开发之路
java·服务器·数据库
Cx330❀7 小时前
一文吃透Linux System V共享内存:原理+实操+避坑指南
大数据·linux·运维·服务器·人工智能
OPHKVPS7 小时前
Anthropic 为 Claude Code 推出“自动模式”:AI 编码工具迈向更高自主性
网络·人工智能·安全·ai
志栋智能7 小时前
超自动化运维的终极目标:让系统自治运行
运维·网络·人工智能·安全·自动化
3GPP仿真实验室7 小时前
【MATLAB源码】CSI-RS:测量链路
linux·网络·matlab
阿 才7 小时前
WSL2 + TFTP + 网络启动(Linux开发板与WSL2建立网络连接)
linux·运维·网络
SP八岐大兔7 小时前
AI对话&OpenClaw全域终极指令大全
网络·人工智能·openclaw
IMPYLH8 小时前
Linux 的 false 命令
linux·运维·服务器·bash