您的位置:首页 > 大数据 > 人工智能

socket domain 样例

2015-06-01 15:32 417 查看
服务端

#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
来自于百度空间
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: