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