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

来源:互联网 发布:npm 淘宝镜像失败 编辑:程序博客网 时间:2024/06/05 10:05

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;}


原创粉丝点击