unix域socket通信实例

来源:互联网 发布:历史知乎 编辑:程序博客网 时间:2024/05/02 06:54
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);//注意要关闭连接符号,不然会超过连接数而报错}}}}
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);}//}}



 

 

原创粉丝点击