socket创建进程使用

实现进程之间的通信需要创建两个进程,假设进程A、进程B

步骤:

进程A:(1)、 创建socket对象 。(2)、准备通信地址(本地socket文件) 。(3)、 绑定sokect对象和地址。(4)、监听、 等待连接。(5)、接收\发送数据。(6)、 关闭socket、删除socket文件 

进程B:(1)、创建socket对象。(2)、准备通信地址。(3)、连接。(4)、发送\接收数据。(5)、关闭socket

演示一个基础代码A进程

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

int main(int argc,const char* argv[])
{
	//	创建socket
	int sockfd = socket(AF_LOCAL,SOCK_STREAM,0);
	if(0 > sockfd)
	{
		perror("socket");
		return EXIT_FAILURE;
	}

	//	准备通信地址
	struct sockaddr_un addr = {};
	addr.sun_family = AF_LOCAL;
	strcpy(addr.sun_path,"sock");
	socklen_t addrlen = sizeof(addr);

	//	绑定socket和通信地址	绑定成功 socket文件就会创建
	if(bind(sockfd,(struct sockaddr*)&addr,addrlen))
	{
		perror("bind");
		return EXIT_FAILURE;
	}

	//	监听
	if(listen(sockfd,5))
	{
		perror("listen");
		return EXIT_FAILURE;
	}

	printf("等待连接中...\n");

	// 等待连接
	int acc_fd = accept(sockfd,NULL,NULL);
	if(0 > acc_fd)
	{
		perror("accept");
		return EXIT_FAILURE;
	}

	char buf[4096] = {};
	printf("有进程连接了...\n");
	for(;;)
	{
		//	接受数据
		printf("recv...\n");
		ssize_t size = recv(acc_fd,buf,sizeof(buf),0);
		if(0 >= size)
		{
			perror("recv");
			break;
		}
		if(0 == strncmp(buf,"quit",4))
		{
			printf("对方结束通信\n");
			break;
		}
		printf("recv:%s\n>>>",buf);

		//	发送数据
		scanf("%s",buf);
		size = send(acc_fd,buf,strlen(buf)+1,0);
		if(0 > size)
		{
			perror("send");
			break;
		}
		if(0 == strncmp(buf,"quit",4))
		{
			printf("我方结束通信\n");
			break;
		}
	}
	//	 关闭socket
	close(acc_fd);
	close(sockfd);
	//	删除socket文件
	unlink(addr.sun_path);
}







B进程

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

int main(int argc,const char* argv[])
{
	//	创建socket
	int sockfd = socket(AF_LOCAL,SOCK_STREAM,0);
	if(0 > sockfd)
	{
		perror("socket");
		return EXIT_FAILURE;
	}

	//	准备通信地址
	struct sockaddr_un addr = {};
	addr.sun_family = AF_LOCAL;
	strcpy(addr.sun_path,"sock");
	socklen_t addrlen = sizeof(addr);


	printf("连接中...\n");

	// 连接
	if(connect(sockfd,NULL,NULL));
	{
		perror("connect");
		return EXIT_FAILURE;
	}

	char buf[4096] = {};
	printf("有进程连接了...\n");
	for(;;)
	{
		//	发送数据
		scanf("%s",buf);
		size = send(acc_fd,buf,strlen(buf)+1,0);
		if(0 > size)
		{
			perror("send");
			break;
		}
		if(0 == strncmp(buf,"quit",4))
		{
			printf("我方结束通信\n");
			break;
		}

		//	接受数据
		printf("recv...\n");
		ssize_t size = recv(acc_fd,buf,sizeof(buf),0);
		if(0 >= size)
		{
			perror("recv");
			break;
		}
		if(0 == strncmp(buf,"quit",4))
		{
			printf("对方结束通信\n");
			break;
		}
		printf("recv:%s\n>>>",buf);


	}
	//	 关闭socket
	close(acc_fd);
	close(sockfd);
}







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值