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 
相关推荐
北京-宏哥43 分钟前
Linux系统安装MySQL5.7(其他版本类似)避坑指南
linux·运维·服务器
靖节先生1 小时前
Wireshark详解
网络·测试工具·wireshark
qw9491 小时前
Linux 高级篇 日志管理、定制自己的Linux系统、备份与恢复
linux·运维·服务器
-SGlow-2 小时前
Linux相关概念和易错知识点(30)(线程互斥、线程同步)
linux·运维·服务器
m0_748236582 小时前
本地部署轻量级web开发框架Flask并实现无公网ip远程访问开发界面
前端·tcp/ip·flask
技术小齐2 小时前
网络运维学习笔记 021 HCIA-Datacom新增知识点02 SDN与NFV概述
运维·网络·学习
茂茂在长安3 小时前
Linux 命令大全完整版(11)
java·linux·运维·服务器·前端·centos
小白&1233 小时前
Linux-CentOS 7安装
linux·运维·服务器
木谷羊宫切割4 小时前
玩机日记 12 群晖部署AList并配置SSL,安装opkg,使用rclone挂载到本地
服务器·网络协议·ssl
ZachOn1y4 小时前
计算机网络:应用层 —— 域名系统 DNS
网络·计算机网络·应用层·408考研·知识积累·域名系统dns