unix socket编程

#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/un.h>
#include <unistd.h>


#define MSG_ADDR_A     "/var/msg_addr_a"
#define MSG_ADDR_B     "/var/msg_addr_b"
#define CMDLINE_LEN 512

int init_sock(int fg)
{
    int l_sockfd = -1;
    int l_ret = -1;
    struct sockaddr_un st_sock_addr;

    l_sockfd = socket(AF_UNIX,SOCK_DGRAM,0);
    if (l_sockfd < 0) {
        perror("cannot create the new cmd sock");
        
        return -1;
    }
    if (fg == 0) {
	    st_sock_addr.sun_family = AF_UNIX;
	    strcpy(st_sock_addr.sun_path, MSG_ADDR_A);
	    unlink(MSG_ADDR_A);

	    l_ret = bind(l_sockfd, (struct sockaddr*)&st_sock_addr, sizeof(st_sock_addr));
	    if (l_ret == -1) {
	        perror("cannot bind the new cmd sock");
	        close(l_sockfd);
	        unlink(MSG_ADDR_A);
	        
	        return -1;
	    }
    	} else {
    	    st_sock_addr.sun_family = AF_UNIX;
	    strcpy(st_sock_addr.sun_path, MSG_ADDR_B);
	    unlink(MSG_ADDR_B);

	    l_ret = bind(l_sockfd, (struct sockaddr*)&st_sock_addr, sizeof(st_sock_addr));
	    if (l_ret == -1) {
	        perror("cannot bind the new cmd sock");
	        close(l_sockfd);
	        unlink(MSG_ADDR_B);
	        
	        return -1;
	    }
    	}
    return l_sockfd;
}

void msg_proc(int fg)
{
    int fd = -1;
    socklen_t  addr_len;
    struct sockaddr_un st_source_addr;
    unsigned char cmdbuf[CMDLINE_LEN];

    int l_ret = -1;
    fd = init_sock(fg);
    if (fd == -1) {
        printf( "[%s]create cmd unix socket err! \n", __func__);
        exit(1);
    }
    
    addr_len = sizeof(struct sockaddr_un);
    if (fg) {
		 struct sockaddr_un st_sock_addr;
		st_sock_addr.sun_family = AF_UNIX;
    		strcpy(st_sock_addr.sun_path, MSG_ADDR_A);
		l_ret = sendto(fd, "1234", strlen("1234"), 0,
                      (struct sockaddr*)&st_sock_addr, sizeof(st_sock_addr));

		 bzero(cmdbuf, CMDLINE_LEN);
		 usleep(100000);
		//l_ret = recvfrom(fd, cmdbuf, CMDLINE_LEN, 0, (struct sockaddr*)&st_sock_addr, &addr_len);
		l_ret = recvfrom(fd, cmdbuf, CMDLINE_LEN, MSG_DONTWAIT, (struct sockaddr*)&st_sock_addr, &addr_len);		            
		printf("cmd=%s\n", cmdbuf);
    } else {
	    while (1) {
		        bzero(cmdbuf, CMDLINE_LEN);
		        l_ret = recvfrom(fd, cmdbuf, CMDLINE_LEN, 0, (struct sockaddr*)&st_source_addr, 
		            &addr_len);
		        
		        if (-1 == l_ret) {
		            perror("recv");
		            printf( "[%s]recv config err! .\n", __func__);
		            sleep(1);
		            continue;
		        }
		        printf("cmd=%s, path=%s\n", cmdbuf, st_source_addr.sun_path);
			 struct sockaddr_un st_des_addr;
			 st_des_addr.sun_family = AF_UNIX;
			 strcpy(st_des_addr.sun_path, MSG_ADDR_B);
    		       
			 l_ret = sendto(fd, "4567", strlen("4567"), 0,
                        (struct sockaddr*)&st_des_addr, sizeof(st_des_addr));
		        
		    }
	    }

    
}
/*
gcc -o unix_udp unix_udp.c
server run: ./unix_udp 0
client run: ./unix_udp 1
*/
int main(int argc, char **argv)
{

    int arg = atoi(argv[1]);
    msg_proc(arg);
    return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

赤露水

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值