linux下unix socket通信--基于udp

来源:互联网 发布:超级捕快软件下载 编辑:程序博客网 时间:2024/04/29 18:02
#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 0
原创粉丝点击