unix域socket通信实例

socket服务器端:server.c  
//socket读写默认的是非阻塞的
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
#include <sys/types.h>
#include <errno.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/select.h>
#include <unistd.h>
#include <termios.h>
#include <sys/stat.h>
/**********定时器头文件***************/
#include <sys/time.h> 
#include <signal.h> 
/***********进程间SOCKET通信头文件**********/
#include <sys/socket.h> 
#include <sys/un.h> 

#define UNIX_DOMAIN "/tmp/UNIX2.domain" 

static char recv_php_buf[256];	//接收client数据的缓冲
static int recv_php_num=0;		//接收client数据的总长度
const char recv_php_buf1[20]={0x00,0x01,0x02,0x03,0x04,0x05,0x06};
void main()
{
	socklen_t clt_addr_len; 
	int listen_fd; 
	int com_fd; 
	int ret=0; 
	int i; 
	
	int len; 
	struct sockaddr_un clt_addr; 
	struct sockaddr_un srv_addr; 
	while(1)
	{
		//创建用于通信的套接字,通信域为UNIX通信域 

		listen_fd=socket(AF_UNIX,SOCK_STREAM,0); 
		if(listen_fd<0)
		{ 
			perror("cannot create listening socket"); 
			continue; 
		} 
		else
		{
			while(1)
			{
				//设置服务器地址参数 
				srv_addr.sun_family=AF_UNIX; 
				strncpy(srv_addr.sun_path,UNIX_DOMAIN,sizeof(srv_addr.sun_path)-1); 
				unlink(UNIX_DOMAIN); 
				//绑定套接字与服务器地址信息 
				ret=bind(listen_fd,(struct sockaddr*)&srv_addr,sizeof(srv_addr)); 
				if(ret==-1)
				{ 
					perror("cannot bind server socket"); 
					close(listen_fd); 
					unlink(UNIX_DOMAIN); 
					break; 
				} 
				//对套接字进行监听,判断是否有连接请求 
				ret=listen(listen_fd,1); 
				if(ret==-1)
				{ 
					perror("cannot listen the client connect request"); 
					close(listen_fd); 
					unlink(UNIX_DOMAIN); 
					break; 
				} 
				chmod(UNIX_DOMAIN,00777);//设置通信文件权限
				while(1)
				{
					//当有连接请求时,调用accept函数建立服务器与客户机之间的连接 
					len=sizeof(clt_addr); 
					com_fd=accept(listen_fd,(struct sockaddr*)&clt_addr,&len); 
					if(com_fd<0)
					{ 
						perror("cannot accept client connect request"); 
						close(listen_fd); 
						unlink(UNIX_DOMAIN); 
						break; 
					} 
					//读取并输出客户端发送过来的连接信息 
					memset(recv_php_buf,0,256); 
					recv_php_num=read(com_fd,recv_php_buf,sizeof(recv_php_buf)); 
					printf("\n=====recv=====\n");
					for(i=0;i<recv_php_num;i++) 
					printf("%d ",recv_php_buf[i]); 
					printf("\n");
					/*if(recv_php_buf[0]==0x02)
					{
						if(recv_php_buf[recv_php_num-1]==0x00)
						{
							recv_php_buf[recv_php_num-1]=0x01;
						}
						else
						{
							recv_php_buf[recv_php_num-1]=0x00;
						}
					}
					*/
					//recv_php_buf[20]+=1;
					write(com_fd,recv_php_buf,recv_php_num);
					printf("\n=====send=====\n");
					for(i=0;i<recv_php_num;i++) 
					printf("%d ",recv_php_buf[i]); 
					printf("\n");
					//write(com_fd,recv_php_buf,20);
					close(com_fd);//注意要关闭连接符号,不然会超过连接数而报错
				}
				
			}

		}
	}


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
#include <sys/types.h>
#include <errno.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/select.h>
#include <unistd.h>
#include <termios.h>
#include <sys/stat.h>
/**********定时器头文件***************/
#include <sys/time.h> 
#include <signal.h> 
/***********进程间SOCKET通信头文件**********/
#include <sys/socket.h> 
#include <sys/un.h> 

#define UNIX_DOMAIN "/tmp/UNIX2.domain" 

static char recv_php_buf[256];	//接收client数据的缓冲
static int recv_php_num=0;		//接收client数据的总长度
const char recv_php_buf1[20]={0x00,0x01,0x02,0x03,0x04,0x05,0x06};
void main()
{
	socklen_t clt_addr_len; 
	int listen_fd; 
	int com_fd; 
	int ret=0; 
	int i; 
	
	int len; 
	struct sockaddr_un clt_addr; 
	struct sockaddr_un srv_addr; 
	while(1)
	{
		//创建用于通信的套接字,通信域为UNIX通信域 

		listen_fd=socket(AF_UNIX,SOCK_STREAM,0); 
		if(listen_fd<0)
		{ 
			perror("cannot create listening socket"); 
			continue; 
		} 
		else
		{
			while(1)
			{
				//设置服务器地址参数 
				srv_addr.sun_family=AF_UNIX; 
				strncpy(srv_addr.sun_path,UNIX_DOMAIN,sizeof(srv_addr.sun_path)-1); 
				unlink(UNIX_DOMAIN); 
				//绑定套接字与服务器地址信息 
				ret=bind(listen_fd,(struct sockaddr*)&srv_addr,sizeof(srv_addr)); 
				if(ret==-1)
				{ 
					perror("cannot bind server socket"); 
					close(listen_fd); 
					unlink(UNIX_DOMAIN); 
					break; 
				} 
				//对套接字进行监听,判断是否有连接请求 
				ret=listen(listen_fd,1); 
				if(ret==-1)
				{ 
					perror("cannot listen the client connect request"); 
					close(listen_fd); 
					unlink(UNIX_DOMAIN); 
					break; 
				} 
				chmod(UNIX_DOMAIN,00777);//设置通信文件权限
				while(1)
				{
					//当有连接请求时,调用accept函数建立服务器与客户机之间的连接 
					len=sizeof(clt_addr); 
					com_fd=accept(listen_fd,(struct sockaddr*)&clt_addr,&len); 
					if(com_fd<0)
					{ 
						perror("cannot accept client connect request"); 
						close(listen_fd); 
						unlink(UNIX_DOMAIN); 
						break; 
					} 
					//读取并输出客户端发送过来的连接信息 
					memset(recv_php_buf,0,256); 
					recv_php_num=read(com_fd,recv_php_buf,sizeof(recv_php_buf)); 
					printf("\n=====recv=====\n");
					for(i=0;i<recv_php_num;i++) 
					printf("%d ",recv_php_buf[i]); 
					printf("\n");
					/*if(recv_php_buf[0]==0x02)
					{
						if(recv_php_buf[recv_php_num-1]==0x00)
						{
							recv_php_buf[recv_php_num-1]=0x01;
						}
						else
						{
							recv_php_buf[recv_php_num-1]=0x00;
						}
					}
					*/
					//recv_php_buf[20]+=1;
					write(com_fd,recv_php_buf,recv_php_num);
					printf("\n=====send=====\n");
					for(i=0;i<recv_php_num;i++) 
					printf("%d ",recv_php_buf[i]); 
					printf("\n");
					//write(com_fd,recv_php_buf,20);
					close(com_fd);//注意要关闭连接符号,不然会超过连接数而报错
				}
				
			}

		}
	}

socket用户端:client.c  
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
#include <sys/types.h>
#include <errno.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/select.h>
#include <unistd.h>
#include <termios.h>
#include <sys/stat.h>
/**********定时器头文件***************/
#include <sys/time.h> 
#include <signal.h> 
/***********进程间SOCKET通信头文件**********/
#include <sys/socket.h> 
#include <sys/un.h> 

#include <sys/ioctl.h>
#pragma pack(1)			//设定为1字节对齐
#define UNIX_DOMAIN2 "/tmp/UNIX2.domain" 
static char recv_php_buf[256]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07};	
struct test
{
	char a;
	int b;
	int c;




}se;
void main(void)
{
	int connect_fd;
	int ret=0;
	int i;
	static struct sockaddr_un srv_addr; 
	printf("ipc通信线程\n");
	//while(1)
	//{
		//创建用于通信的套接字,通信域为UNIX通信域 
		connect_fd=socket(AF_UNIX,SOCK_STREAM,0); 
		printf("%d\n",connect_fd); 
		if(connect_fd<0)
		{ 
			perror("cannot create communication socket");
			printf("%d\n",connect_fd); 
			//continue;
		} 
		else
		{
			//while(1)
			//{
				srv_addr.sun_family=AF_UNIX; 
				strcpy(srv_addr.sun_path,UNIX_DOMAIN2);
			
				//连接服务器 
				ret=connect(connect_fd,(struct sockaddr*)&srv_addr,sizeof(srv_addr)); 
				if(ret==-1)
				{ 
					close(connect_fd); 
					printf("connect fail\n");
					//break;			//重新创建socket
				}
				else
				{	
				//否则,连接服务器成功
				//while(1)
				//{
					se.a=0x01;
					se.b=0x01020304;
					se.c=0x05060708;
					write(connect_fd,recv_php_buf,20);//将数据传送到外部应用程序,发送实际长度
					//write(connect_fd,&se,sizeof(struct test));
					memset(recv_php_buf,0,sizeof(recv_php_buf)); 							 //清空socket_buf
					//sleep(1);
					//fcntl(connect_fd,F_SETEL,O_NONBLOCK);
					read(connect_fd,recv_php_buf,sizeof(recv_php_buf));
					printf("receive over\n");
					for(i=0;i<20;i++)
					printf("%x ",recv_php_buf[i]);
					//printf("%x ",se.a);
					//printf("%x ",se.b);
					//printf("%x ",se.c);
					close(connect_fd);
					//break;							
				//}
				}
			
			//}
			//close(connect_fd);
		}
	
	//}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个简单的 Unix Domain Socket 通信实例,包括了服务端和客户端代码: 服务端代码: ```cpp #include <sys/socket.h> #include <sys/un.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #define SOCK_PATH "/tmp/echo_socket" int main(int argc, char *argv[]) { int s, s2, len; struct sockaddr_un local, remote; char str[100]; if ((s = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) { perror("socket"); exit(1); } local.sun_family = AF_UNIX; strcpy(local.sun_path, SOCK_PATH); unlink(local.sun_path); len = strlen(local.sun_path) + sizeof(local.sun_family); if (bind(s, (struct sockaddr *)&local, len) == -1) { perror("bind"); exit(1); } if (listen(s, 5) == -1) { perror("listen"); exit(1); } printf("Waiting for a connection...\n"); while (1) { int done, n; unsigned int t; t = sizeof(remote); if ((s2 = accept(s, (struct sockaddr *)&remote, &t)) == -1) { perror("accept"); exit(1); } printf("Connected.\n"); done = 0; do { n = recv(s2, str, 100, 0); if (n <= 0) { if (n < 0) perror("recv"); done = 1; } if (!done) { if (send(s2, str, n, 0) < 0) { perror("send"); done = 1; } } } while (!done); close(s2); } return 0; } ``` 客户端代码: ```cpp #include <sys/socket.h> #include <sys/un.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #define SOCK_PATH "/tmp/echo_socket" int main(int argc, char *argv[]) { int s, len; struct sockaddr_un remote; char *str = "hello, world!"; if ((s = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) { perror("socket"); exit(1); } remote.sun_family = AF_UNIX; strcpy(remote.sun_path, SOCK_PATH); len = strlen(remote.sun_path) + sizeof(remote.sun_family); if (connect(s, (struct sockaddr *)&remote, len) == -1) { perror("connect"); exit(1); } if (send(s, str, strlen(str), 0) == -1) { perror("send"); exit(1); } if (recv(s, str, strlen(str), 0) == -1) { perror("recv"); exit(1); } printf("Received: %s\n", str); close(s); return 0; } ``` 服务端代码创建了一个 Unix Domain Socket 并监听,一旦有客户端连接进来,服务端就接收客户端发送的数据,并将其原样返回。客户端代码连接到服务端,并发送一个字符串,然后等待服务端返回数据并打印。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值