Window中模拟Linux管道功能的函数

Window中模拟Linux管道功能的函数

参数

int nPortNo; // 端口号

int nPipe[2]; // 传出socket通信用的ID  [0]收消息,[1]发信息

函数实现

int CreatePipe(intnPortNo, int nPipe[2])
{
    int iSts = 0;
    printf("PIPE 创建");
// Windows中创建管道(linux中的管道)
#ifdef WIN32
    int iSockfd;
    int iSocklen;
    long lTemp;
    struct sockaddr_in srcAddr;
    struct sockaddr_in dstAddr;
    WSADATA data;
    int iErno;

    // 变量初始化
    iSockfd = -1;
    iSocklen = sizeof(struct sockaddr_in);
    lTemp = 0;
    iErno = 0;
    memset(&srcAddr, 0, sizeof(srcAddr));
    memset(&dstAddr, 0, sizeof(dstAddr));
    memset(&data, 0, sizeof(data)); 

    // WinSock初始化
    iErno = WSAStartup(MAKEWORD(2,0),&data);
    if(iErno != 0) {
        printf("WinSock初始化失败");
        return -1;
    }

    // 创建socket
    iSockfd = socket(AF_INET, SOCK_STREAM,IPPROTO_TCP);
    if(iSockfd == -1) {
        printf("创建socket失败");
        return -1;
    }

    // 设置sockaddr_in 结构体
    memset(&srcAddr, 0, sizeof(srcAddr));
    srcAddr.sin_port = htons((u_short)nPortNo);
    srcAddr.sin_family = AF_INET;
    srcAddr.sin_addr.s_addr =htonl(INADDR_ANY); 

    // 绑定
    iSts = bind(iSockfd, (struct sockaddr*)&srcAddr,sizeof(srcAddr));
    if(iSts != 0) {
        printf("bind失败");
        return -1;
    }

    // 监听
    iSts = listen(iSockfd, 1);
    if(iSts != 0) {
        printf("listen失败");
        return -1;
    }
    // 地址取得
    iSts = getsockname(iSockfd, (structsockaddr *)&dstAddr, &iSocklen);
    if( iSts != 0) {
        printf("getsockname失败");
        return -1;
    }
    // WinSock初始化
    nPipe[1] = socket(AF_INET, SOCK_STREAM,IPPROTO_TCP);
    if(nPipe[1] == -1) {
        printf("nPipe[1] socket 生成失败");
        return -1;
    }

    // socket阻塞
    lTemp  =1;
    ioctlsocket(nPipe[1], FIONBIO, (u_long*)&lTemp);
    dstAddr.sin_addr.s_addr =htonl(INADDR_LOOPBACK);

    // 连接
    iSts = connect(nPipe[1], (struct sockaddr*)&dstAddr, sizeof(dstAddr));
    if(iSts == -1) {
        lTemp = WSAGetLastError();
        if ((lTemp != WSAEWOULDBLOCK)&& (lTemp != WSAEINPROGRESS)) {
            printf("connect失败");
            return -1;
        }
    }

    // 接受连接,生成新的socket ID
    nPipe[0] = (int)accept(iSockfd, (structsockaddr *)&srcAddr, &iSocklen);
    if(nPipe[0] == -1) {
        printf("accept失败");
        return -1;
    }

    // 去掉socket的阻塞
    lTemp  =0;
    ioctlsocket(nPipe[1], FIONBIO,(u_long*)&lTemp);
    closesocket(iSockfd);
#else
    // linux中直接创建管道
    iSts = socketpair(AF_UNIX, SOCK_STREAM, 0,nPipe);
    if(iSts != 0) {
        printf("socketpair失败");
        return -1;
    }
#endif
    return 0;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值