一、基于内存的通信
1、内核共享内存
编程模型:
1.1 创建共享内存,得到一个ID :shmget
2.1 把ID映射成虚拟地址 :shmat
3.1 使用虚拟地址访问内核共享内存 ,使用内存函数与运算符
str**系列函数,mem** 系列等等! 与平时访问内存差不多
3.2 卸载虚拟地址 :shmdt ,
3.3 删除共享内存 :shmctl(修改/获取共享内存的属性:)
共享内存使用,主要就是使用者上面几个函数:shmget , shmat, shmdt , shmctl
使用:
/// 创建共享内存 //
二、socket
1、模型
服务器端:
1.建立socket
2.绑定在地址上(文件目录地址)URL
协议://路径/文件名
file://usr/bin/ls
http://192.168.2.12/index.php
stuct sockaddr
struct sockaddr_un ;un = unix
struct sockaddr_in;in = internet
bind :
3、接收数据:read/write send/recv sendto/recvfrom
4、 关闭socket
客户端:
1、建立socket:socket
2、连接目标:connect
3、发送/接收数据:send、recv recvfrom
4、关闭socket
例子:
@1#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <linux/un.h>
#include <string.h>
#include <unistd.h>
int main()
{
int fd;
struct sockaddr_un addr = {0};
//简历连接
fd = socket(AF_UNIX,SOCK_DGRAM,0);
//连接到指定地址
addr.sun_family = AF_UNIX;
memcpy(addr.sun_path,"my1.sock",strlen("my1.sock"));
int r = 0;
//绑定
r = bind(fd,(struct sockaddr*)&addr,sizeof(addr));
if(r == -1)printf("bind err:%m\n"),exit(-1);
printf("bind 成功!\n");
//发送
char buf[20];
while(1)
{
bzero(buf,sizeof(buf));
r = read(fd,buf,sizeof(buf));
buf[r] =0;
printf("%s\n",buf);
}
//关闭
close(fd);
//删除socket文件
unlink("my1.sock");
}
@2
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <linux/un.h>
#include <string.h>
#include <unistd.h>
int main()
{
int fd;
struct sockaddr_un addr = {0};
//简历连接
fd = socket(AF_UNIX,SOCK_DGRAM,0);
//连接到指定地址
addr.sun_family = AF_UNIX;
memcpy(addr.sun_path,"my1.sock",strlen("my1.sock"));
int r = 0;
//连接
r = connect(fd,(struct sockaddr*)&addr,sizeof(addr));
//发送
char buf[]= "maomao";
while(1)
{
sleep(1);
write(fd,buf,sizeof(buf)/sizeof(char));
}
//关闭
close(fd);
}
## 1
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <linux/un.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <netinet/in.h>
int main()
{
int fd;
struct sockaddr_in addr = {0};
//简历连接
fd = socket(AF_INET,SOCK_DGRAM,0);
//连接到指定地址
addr.sin_family = AF_INET;
addr.sin_port = htons(6000);
addr.sin_addr.s_addr =htonl(INADDR_ANY);
int r = 0;
//绑定
r = bind(fd,(struct sockaddr*)&addr,sizeof(addr));
if(r == -1)printf("bind err:%m\n"),exit(-1);
printf("bind 成功!\n");
//发
char buf[20];
while(1)
{
bzero(buf,sizeof(buf));
r = read(fd,buf,sizeof(buf));
buf[r] =0;
printf("%s\n",buf);
}
//关闭
close(fd);
//删除socket文件
unlink("my1.sock");
}
###########2
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <linux/un.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <netinet/in.h>
int main()
{
int fd;
struct sockaddr_in addr = {0};
//简历连接
fd = socket(AF_INET,SOCK_DGRAM,0);
//连接到指定地址
addr.sin_family = AF_INET;
addr.sin_port = htons(6000);
addr.sin_addr.s_addr = htonl(INADDR_ANY);
int r = 0;
//连接
r = connect(fd,(struct sockaddr*)&addr,sizeof(addr));
//发送
char buf[]= "maomao";
while(1)
{
sleep(1);
write(fd,buf,sizeof(buf)/sizeof(char));
}
//关闭
close(fd);
}
##################################