IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> UNIX环境高级编程c语言---本地通信 -> 正文阅读

[网络协议]UNIX环境高级编程c语言---本地通信

网络通信

在这里插入图片描述
参数:
AF_UNIX/AF_LOCAL/AF_FILE: 本地通信(进程间通信);
AF_INET: 基于TCP/IPv4(32位IP地址)的网络通信;
AF_INET6: 基于TCP/IPv6(128位IP地址)的网络通信;
AF_PACKET: 基于底层包接口的网络通信。

type - 通信协议,取值:

SOCK_STREAM: 数据流协议,即TCP协议;
SOCK_DGRAM: 数据报协议,即UDP协议。

protocol - 特别通信协议,一般不用,置0即可。

成功返回套接字描述符,失败返回-1。

本地通信

在这里插入图片描述

基于UDP协议的本地通信

服务器

#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/un.h>
#include <stdbool.h>

#define SOCK_FILE "/tmp/socket"

int main(){
	printf("1.服务器创建socket文件描述符.\n");
	int sfd = socket(AF_LOCAL,SOCK_DGRAM,0);
	if(sfd == -1){
		perror("socket");
		return -1;
	}
	printf("2.准备物理通信地址.\n");
	struct sockaddr_un addr;
	addr.sun_family = AF_LOCAL;//和创建socket时指定的domain取一样的值
	strcpy(addr.sun_path,SOCK_FILE);
	socklen_t len = sizeof(addr);
	printf("3.socket套接字绑定物理地址.\n");
	int ret = bind(sfd,(const struct sockaddr*)&addr,len);
	if(ret == -1){
		perror("bind");
		return -1;
	}
	char buf[1024] = {};
	while(true){
		//1.接收客户端的消息
		
		ret = read(sfd,buf,1024);
		if(ret == -1){
			perror("read");
			break;
		}
		printf("recv: %s",buf);
		if(strcmp(buf,"!quit\n")==0){//要求退出
			break;	
		}
		//2.给客户端回一个消息
/*	
		printf(">");
		fgets(buf,1024,stdin);
		ret = write(sfd,buf,strlen(buf)+1);
		if(ret == -1){
			perror("write");
			break;
		}
		if(strcmp(buf,"!quit\n")==0){//要求退出
			break;	
		}
*/	
	}
	close(sfd);
	unlink(SOCK_FILE);//删除socket文件
	return 0;	
}

客户端

#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/un.h>
#include <stdbool.h>

#define SOCK_FILE "/tmp/socket"

int main(){
	printf("1.客户端创建socket文件描述符.\n");
	int sfd = socket(AF_LOCAL,SOCK_DGRAM,0);
	if(sfd == -1){
		perror("socket");
		return -1;
	}
	printf("2.准备物理通信地址.\n");
	struct sockaddr_un addr;
	addr.sun_family = AF_LOCAL;//和创建socket时指定的domain取一样的值
	strcpy(addr.sun_path,SOCK_FILE);
	socklen_t len = sizeof(addr);
	printf("3.socket套接字绑定物理地址.\n");
	//int ret = bind(sfd,(const struct sockaddr*)&addr,len);
	int ret = connect(sfd,(const struct sockaddr*)&addr,len);//连接服务器
	if(ret == -1){
		perror("connect");
		return -1;
	}
	char buf[1024] = {};
	while(true){
		//1.给服务器发送一个消息
		
		printf(">");
		fgets(buf,1024,stdin);
		ret = write(sfd,buf,strlen(buf)+1);
		if(ret == -1){
			perror("write");
			break;
		}
		if(strcmp(buf,"!quit\n")==0){//要求退出
			break;	
		}
		/*
		//2.接收服务器的消息
		ret = read(sfd,buf,1024);
		if(ret == -1){
			perror("read");
			break;
		}
		printf("recv: %s",buf);
		if(strcmp(buf,"!quit\n")==0){//要求退出
			break;	
		}
		*/
	}

	close(sfd);
	return 0;	
}

基于TCP协议的本地通信

服务器

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <stdbool.h>

#define SOCK_FILE "/tmp/socket"

int main(){
	unlink(SOCK_FILE); //删除socket文件
	printf("1.服务器创建socket文件描述符.\n");
	int sfd = socket(AF_UNIX,SOCK_STREAM,0);
	if(sfd == -1){
		perror("socket");
		return -1;
	}
	
	printf("2.准备物理通信地址.\n");
	struct sockaddr_un addr = {};
	addr.sun_family = AF_UNIX;
	strcpy(addr.sun_path,SOCK_FILE);
	socklen_t len = sizeof(addr);
	printf("3.socket套接字绑定到物理地址.\n");
	int ret = bind(sfd,(struct sockaddr*)&addr,len);
	if(ret == -1){
		perror("bind");
		return -1;
	}
	printf("4.监听.\n");
	listen(sfd,3);
	printf("5.等待客户端连接上来.\n");
	int cfd = accept(sfd,NULL,NULL);
	if(cfd == -1){
		perror("accept");
		return -1;
	}
	printf("6.有客户端连接上来.\n");
	char buf[1024]={};
	pid_t id = fork();
	if(id == -1){
		perror("fork");
		return -1;	
	}
	while(true){
		if(id == 0){
			ret = read(cfd,buf,1024);
			if(ret == -1||ret == 0){
				perror("read");
				break;	
			}
			printf("recv:%s>",buf);
		}else{
			printf(">");
			fgets(buf,1024,stdin);
			ret = write(cfd,buf,strlen(buf)+1);
			if(ret == -1||ret==0){
				perror("write");
				break;
			}
		}
	}
	close(cfd);
	close(sfd);
	unlink(SOCK_FILE);
	return 0;	
}

客户端

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <stdbool.h>

#define SOCK_FILE "/tmp/socket"

int main(){
	printf("1.客户创建socket文件描述符.\n");
	int sfd = socket(AF_UNIX,SOCK_STREAM,0);
	if(sfd == -1){
		perror("socket");
		return -1;
	}
	
	printf("2.准备连接到哪个物理通信地址.\n");
	struct sockaddr_un addr = {};
	addr.sun_family = AF_UNIX;
	strcpy(addr.sun_path,SOCK_FILE);
	socklen_t len = sizeof(addr);
	printf("3.连接服务器.\n");
	//int ret = bind(sfd,(struct sockaddr*)&addr,len);
	int ret = connect(sfd,(struct sockaddr*)&addr,len);
	if(ret == -1){
		perror("bind");
		return -1;
	}
	char buf[1024]={};
	pid_t id = fork();
	if(id == -1){
		perror("fork");
		return -1;
	}
	while(true){
		if(id == 0){
			printf(">");
			fgets(buf,1024,stdin);
			ret = write(sfd,buf,strlen(buf)+1);
			if(ret == -1||ret==0){
				perror("write");
				break;
			}
		}else{
			ret = read(sfd,buf,1024);
			if(ret == -1||ret==0){
				perror("read");
				break;	
			}
			printf("recv:%s>",buf);
		}
	}
	close(sfd);
	return 0;	
}

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-08-23 17:02:36  更:2021-08-23 17:04:24 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 21:41:48-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码