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