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 
相关推荐
笑衬人心。12 分钟前
TCP 拥塞控制算法 —— 慢启动(Slow Start)笔记
笔记·tcp/ip·php
van叶~15 分钟前
Linux探秘坊-------15.线程概念与控制
linux·运维·服务器
2301_780789664 小时前
UDP和TCP的主要区别是什么
服务器·网络协议·web安全·网络安全·udp
_丿丨丨_5 小时前
XSS(跨站脚本攻击)
前端·网络·xss
一只栖枝6 小时前
HCIA-Security 认证精讲!网络安全理论与实战全掌握
网络·web安全·网络安全·智能路由器·hcia·it·hcia-security
FileLink跨网文件交换6 小时前
文件摆渡系统十大软件|文件摆渡系统如何构建网络安全呢?
网络
一个龙的传说7 小时前
linux 常用命令
linux·服务器·zookeeper
斯是 陋室9 小时前
在CentOS7.9服务器上安装.NET 8.0 SDK
运维·服务器·开发语言·c++·c#·云计算·.net
晨欣9 小时前
大型语言模型(LLM)在网络安全中最具商业价值的应用场景(Grok3 回答 DeepSearch模式)
网络·web安全·语言模型
有书Show10 小时前
个人IP的塑造方向有哪些?
网络·网络协议·tcp/ip