socket domain 样例

来源:互联网 发布:matlab版本 mac 编辑:程序博客网 时间:2024/06/05 15:41

服务端

#include<stdio.h>
#include <sys/stat.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <errno.h>
#include <stddef.h>
#include <string.h>
#include <stdlib.h>

#define LISTEN_SOCKET "/tmp/liuyi.sock"     //
#define LISTEN_BACKLOG 5
#define BIG_BUF 4096

int main()
{
    int listenfd,connfd;
    struct sockaddr_un un_s,un_c;
    int len;

    struct stat statbuf;
    uid_t uid;

    int ret;
    char recvBuf[BIG_BUF];
    char sendBuf[BIG_BUF];

    listenfd=socket(AF_UNIX, SOCK_STREAM, 0);
    if(listenfd<=0){
        perror("socket create error");
        exit(-1);
    }
    unlink(LISTEN_SOCKET);
    memset(&un_s,0,sizeof(struct sockaddr_un));
    un_s.sun_family = AF_UNIX;
    strcpy(un_s.sun_path, LISTEN_SOCKET);
    len = offsetof(struct sockaddr_un, sun_path) + strlen(LISTEN_SOCKET);
    if(bind(listenfd,(struct sockaddr *)&un_s, len)<0){
        perror("socket bind error");
        exit(-1);
    }
    if(listen(listenfd,LISTEN_BACKLOG)<0){
        perror("socket listen error");
        exit(-1);
    }
    memset(&un_c,0,sizeof(struct sockaddr_un));
    len=sizeof(struct sockaddr_un);
    connfd=accept(listenfd,(struct sockaddr *)&un_c,&len);
    if(connfd<=0){
        perror("socket accept error");
        exit(-1);
    }
    printf("connfd=[%d]\n",connfd);
    len -= offsetof(struct sockaddr_un, sun_path);
    un_c.sun_path[len] ='\0';
    //取文件状态
    if(stat(un_c.sun_path, &statbuf)<0){
        perror("stat error");
        exit(-1);
    }
    //判断是不是socket 文件   srwxr-xr-x 1 sandjmk   liuyi.sock
    if(S_ISSOCK(statbuf.st_mode) == 0){
        perror("Is not a socket");
        exit(-1);
    }
    printf("useid[%d]socket[%s]connect\n",statbuf.st_uid,un_c.sun_path);
    unlink(un_c.sun_path);


    memset(recvBuf,0,sizeof(recvBuf));
    ret = read(connfd,recvBuf,sizeof(recvBuf));
    printf("read ret[%d][%d]\n",ret,errno);
    printf("recv:[%s]\n",recvBuf);

    memset(sendBuf,'B',sizeof(sendBuf)-1);
    ret = write(connfd,sendBuf,sizeof(sendBuf));
    printf("write ret=[%d]\n",ret);

    close(connfd);

    return 0;
}


客户端

#include<stdio.h>
#include <sys/stat.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <errno.h>
#include <stddef.h>
#include <string.h>
#include <stdlib.h>

#define SOCKET_PATH "/tmp/"
#define LISTEN_SOCKET "/tmp/liuyi.sock"
#define BIG_BUF 4096

int main()
{
    int connfd;
    struct sockaddr_un un_s,un_c;
    int len;
    int ret;
    
    char recvBuf[BIG_BUF];
    char sendBuf[BIG_BUF];
    connfd=socket(AF_UNIX, SOCK_STREAM, 0);
    if(connfd<=0){
        perror("socket create error");
        exit(-1);
    }
    memset(&un_s,0,sizeof(struct sockaddr_un));
    un_s.sun_family = AF_UNIX;
    sprintf(un_s.sun_path, "%sliuyi.%05d",SOCKET_PATH,getpid());
    len = offsetof(struct sockaddr_un, sun_path) + strlen(un_s.sun_path);
    unlink(un_s.sun_path);
    if(bind(connfd,(struct sockaddr *)&un_s, len)<0){
        perror("socket bind error");
        exit(-1);
    }
    memset(&un_s,0,sizeof(struct sockaddr_un));
    un_s.sun_family = AF_UNIX;
    sprintf(un_s.sun_path,LISTEN_SOCKET);
    len = offsetof(struct sockaddr_un, sun_path) + strlen(un_s.sun_path);
    if(connect(connfd,(struct sockaddr *)&un_s, len)<0){
        perror("socket connect error");
        exit(-1);
    }
    memset(sendBuf,'A',sizeof(sendBuf)-1);
    ret = write(connfd,sendBuf,sizeof(sendBuf));
    printf("write ret=[%d]\n",ret);
    //sleep(1);
    memset(recvBuf,0,sizeof(recvBuf));
    ret = read(connfd,recvBuf,sizeof(recvBuf));
    printf("read ret[%d][%d]\n",ret,errno);
    printf("recv:[%s]\n",recvBuf);

    return 0;    
}

收藏于 2014-07-21
0 0
原创粉丝点击