打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
socket本地进程通信


// CDomain.h
#ifndef _DOMAIN_H_
#define _DOMAIN_H_

#include <stdio.h>
#include <string.h>
#include <unistd.h>

class CDomain{
public:
int create_domain_socket(const char *path);
int unix_connect(char *client_path, char *server_path);
private:
};

#endif

=================================================================


// CDomain.cpp
#include <unistd.h>
#include <stdlib.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/un.h>
#include <netdb.h>
#include <arpa/inet.h>
#include <sys/syscall.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include "domain.h"

int CDomain::create_domain_socket(const char *path)
{
int socket_fd = 0;
struct sockaddr_un addr;
int ret = 0;

if(path == NULL)
{
return -1;
}

socket_fd = socket(AF_LOCAL, SOCK_DGRAM, 0);
if(socket_fd < 0)
{
return -1;
}

bzero(&addr, sizeof(struct sockaddr_un));
addr.sun_family = AF_LOCAL;
strcpy(addr.sun_path, path);
addr.sun_path[sizeof(addr.sun_path) - 1] = 0;
unlink(path);

ret = bind(socket_fd, (struct sockaddr *)&addr, sizeof(struct sockaddr_un));
if(ret != 0)
{
    close(socket_fd);
return -1;
}

return socket_fd;
}


int CDomain::unix_connect(char *client_path, char *server_path)
{
    struct sockaddr_un  servaddr, g_cliaddr;        //socket连接变量
    int sockfd;                                     //socket连接描述
    int ret = -1;

    if(NULL == client_path || NULL == server_path)
    {
        return -1;
    }

    sockfd = socket( AF_LOCAL, SOCK_DGRAM, 0 );
    if ( sockfd < 0 )
    {
        return -1; 
    } 
    //清空连接记录
    bzero( &servaddr, sizeof( servaddr ) );
    bzero( &g_cliaddr, sizeof(g_cliaddr) );

    //注册客户
    g_cliaddr.sun_family = AF_LOCAL;
    strcpy( g_cliaddr.sun_path, client_path );
    unlink( client_path );

    //绑定socket连接信息,如果绑定失败则返回error
    if ( -1 == bind( sockfd, (struct sockaddr*)&g_cliaddr, sizeof( g_cliaddr ) ) )
    {
        goto result;
    }


    //注册域   
    servaddr.sun_family = AF_LOCAL;
    strcpy( servaddr.sun_path, server_path );

    //绑定信息,失败则返回error
    if ( -1 == connect(sockfd, (struct sockaddr *)&servaddr, sizeof( servaddr ) ) )
    {
        goto result;
    }

    ret = 0;
result:
    if(ret < 0)
    {
        close(sockfd);
        return -1;
    }

    return sockfd;
}


========================================================

// client.cpp
#include "domain.h"

int main(int argc, char *argv[])
{
if(argc < 2)
{
printf("please input 2 param\n");
return -1;
}

int len = -1;
char buf[1024] = {"wahahahahah"};
CDomain client;

char client_path[] = {"tanxiaohai11"};
char server_path[] = {"tanhuifang"};
int fd = client.unix_connect(client_path, server_path);
if(fd < 0)
{
printf("err fd\n");
return 0;
}

while(1)
{
len = write(fd, buf, sizeof(buf));
if(0 < len)
{
printf("T -----write success len[%d]\n", len);
}
usleep(2000*1000);
}
return 0;
}


===========================================
//server.cpp
#include "domain.h"

int main()
{
int len = -1;
char buf[1024] = {};
CDomain client;

char client_path[] = {"tanxiaohai"};
char server_path[] = {"tanhuifang"};
int fd = client.create_domain_socket(server_path);
if(fd < 0)
{
printf("err fd\n");
return 0;
}

while(1)
{
len = read(fd,buf,1024);
if(0 < len)
{
printf("T --server recv---[%s]\n", buf);
}
usleep(20*1000);
}
return 0;
}





本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
linux 编程
SOCKET UDP组播 实例
几种TCP连接中出现RST的情况( 比较详细)
socket之send与发送缓冲区大小的关系
C语言安全文件传输程序设计。
【android学习笔记】init.rc中声明的守护进程启动的流程
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服