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 
相关推荐
Linux运维老纪42 分钟前
Go语言之十条命令(The Ten Commands of Go Language)
服务器·开发语言·后端·golang·云计算·运维开发
真想骂*1 小时前
iOS开发指南:保护服务器密码的安全存储与处理技巧
服务器·安全·ios
Antonio9151 小时前
【Linux】环境变量
linux·运维·服务器
域智盾-运营小韩1 小时前
怎么管理电脑usb接口,分享四种USB端口管理方法
服务器·网络·负载均衡
犹若故人归1 小时前
计算机网络、嵌入式等常见问题简答
java·网络·嵌入式硬件·计算机网络·intellij-idea
法迪2 小时前
初学Linux电源管理
linux·运维·服务器·功耗
shelby_loo2 小时前
在 Ubuntu 下通过 Docker 部署 MySQL 服务器
服务器·ubuntu·docker
LLLuckyGirl~2 小时前
计算机网络之---信号与编码
网络·计算机网络
jiecy2 小时前
OSPF浅析
网络
komo莫莫da2 小时前
第5章——与HTTP协作的Web服务器
服务器·前端·http