在下面的程序中,从文件可以读到数据,但是通过管道不能发送出去?
是不是服务器端只能接受数据?
BOOL fConnected;
SECURITY_ATTRIBUTES sa;
DWORD dwThreadID=0;
HANDLE hRead,hWrite,hThread,hNamedPipe;
LPTSTR lpszPipename="\\\\.\\pipe\\mem.swf";//管道名 sa.nLength=sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor=NULL;
sa.bInheritHandle=TRUE;
//建立一个文件管道
cout<<"开始建立一个管道..."<<endl;
hNamedPipe=CreateNamedPipe(
lpszPipename,//管道名
PIPE_ACCESS_DUPLEX,//打开方式
PIPE_TYPE_BYTE|//管道模式
PIPE_READMODE_BYTE|
PIPE_WAIT,
1,//线程数不受限制,=255
10240, //输出缓存大小
256, //输入缓存大小
PIPE_TIMEOUT, //超时设置
sa //安全质量参数
);
if(hNamedPipe==INVALID_HANDLE_VALUE){
cout<<"管道建立失败..."<<endl;
return 0;
}
cout<<"管道建立成功..."<<endl;
cout<<"建立客户端线程..."<<endl;
fConnected=ConnectNamedPipe(hNamedPipe,NULL);
if(!fConnected){
cout<<"客户线程连接失败..."<<endl;
return 0;
}
cout<<"客户线程连接成功..."<<endl;
cout<<"现在开始建立数据接受线程..."<<endl;
cout<<"进入数据接受线程..."<<endl;
DWORD bufferLen=256,readyByte=0,sentByte=0;
byte sendBuffer[256];
while(true){
readyByte=fread(sendBuffer,sizeof(byte),bufferLen,file);
if(readyByte==0){
break;
}
cout<<"需发送数据个数为:"<<readyByte<<endl;
if(WriteFile(hNamedPipe,sendBuffer,readyByte,&sentByte,NULL)){
cout<<"已发送数据个数为:"<<sentByte<<endl;
Sleep(400);
}
else{
cout<<"发送数据出错..."<<endl;
break;
}
}
cout<<"按任意键退出"<<endl;
getchar();
CloseHandle(hNamedPipe);
return 1;
}
是不是服务器端只能接受数据?
BOOL fConnected;
SECURITY_ATTRIBUTES sa;
DWORD dwThreadID=0;
HANDLE hRead,hWrite,hThread,hNamedPipe;
LPTSTR lpszPipename="\\\\.\\pipe\\mem.swf";//管道名 sa.nLength=sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor=NULL;
sa.bInheritHandle=TRUE;
//建立一个文件管道
cout<<"开始建立一个管道..."<<endl;
hNamedPipe=CreateNamedPipe(
lpszPipename,//管道名
PIPE_ACCESS_DUPLEX,//打开方式
PIPE_TYPE_BYTE|//管道模式
PIPE_READMODE_BYTE|
PIPE_WAIT,
1,//线程数不受限制,=255
10240, //输出缓存大小
256, //输入缓存大小
PIPE_TIMEOUT, //超时设置
sa //安全质量参数
);
if(hNamedPipe==INVALID_HANDLE_VALUE){
cout<<"管道建立失败..."<<endl;
return 0;
}
cout<<"管道建立成功..."<<endl;
cout<<"建立客户端线程..."<<endl;
fConnected=ConnectNamedPipe(hNamedPipe,NULL);
if(!fConnected){
cout<<"客户线程连接失败..."<<endl;
return 0;
}
cout<<"客户线程连接成功..."<<endl;
cout<<"现在开始建立数据接受线程..."<<endl;
cout<<"进入数据接受线程..."<<endl;
DWORD bufferLen=256,readyByte=0,sentByte=0;
byte sendBuffer[256];
while(true){
readyByte=fread(sendBuffer,sizeof(byte),bufferLen,file);
if(readyByte==0){
break;
}
cout<<"需发送数据个数为:"<<readyByte<<endl;
if(WriteFile(hNamedPipe,sendBuffer,readyByte,&sentByte,NULL)){
cout<<"已发送数据个数为:"<<sentByte<<endl;
Sleep(400);
}
else{
cout<<"发送数据出错..."<<endl;
break;
}
}
cout<<"按任意键退出"<<endl;
getchar();
CloseHandle(hNamedPipe);
return 1;
}
解决方案 »
- Textout函数
- [求教]调小socket的send buffer and recv buffer, 是不是可以减少一个socket占用的未分页内存, 以增加系统可以接入的连接数?
- Call MyFunction("Hello World")//出错,为什么??
- 我要导出一个Dll函数,自己动手加了一个。Def文件,编译出错,偶菜,请高手帮一下
- #include "..\CmnHdr.h"中的“..“是什么意思?
- 如何根据线程ID和进程ID得到窗体的Title?
- 请问如何获得应用程序主窗体的句柄?
- 关于属性页的背景色切换问题!
- 如何初始化VARIANT变量?
- 没人会算吗?!
- 我要改变ListCtrl选中的item的背景色,请问怎么实现,谢谢!
- 程序的图标问题
//#define BUFSIZE 22000
#define PIPE_TIMEOUT 1
const int BUFSIZE = sizeof(swfData)-33; DWORD dwThreadId;
HANDLE hPipe, hThread;
//LPTSTR lpszPipename = _T("\\\\.\\Pipe\\Test"); //*
hPipe = CreateNamedPipe(
g_lpszPipename, // pipe name
PIPE_ACCESS_DUPLEX, // read/write access
PIPE_TYPE_MESSAGE | // message type pipe
PIPE_READMODE_MESSAGE | // message-read mode
PIPE_WAIT, // blocking mode
PIPE_UNLIMITED_INSTANCES, // max. instances
BUFSIZE, // output buffer size
BUFSIZE, // input buffer size
PIPE_TIMEOUT, // client time-out
NULL); // no security attribute
//*/
//hPipe = CreateNamedPipe(_T("\\\\.\\Pipe\\Test"), PIPE_ACCESS_DUPLEX, PIPE_TYPE_BYTE | PIPE_READMODE_BYTE, 1, 0, 0, 1000, NULL); // 创建命名管道
if (hPipe == INVALID_HANDLE_VALUE)
{
::MessageBox (NULL, TEXT ("失败"), TEXT ("测试"), MB_TOPMOST);
}
else
{
// Create a thread for this client.
hThread = CreateThread (
NULL, // no security attribute
0, // default stack size
InstanceThread, //(LPTHREAD_START_ROUTINE)InstanceThread
(LPVOID) hPipe, // thread parameter
0, // not suspended
&dwThreadId); // returns thread ID if (hThread == NULL)
::MessageBox (NULL, TEXT ("hThread"), TEXT ("测试"), MB_TOPMOST);
else
CloseHandle(hThread);
} if (ConnectNamedPipe(hPipe, NULL) == FALSE) // 等待客户机的连接
{
::MessageBox (NULL, TEXT ("连接失败"), TEXT ("测试"), MB_TOPMOST);
CloseHandle(hPipe); // 关闭管道句柄
} else {
::MessageBox (NULL, TEXT ("连接成功"), TEXT ("测试"), MB_TOPMOST);
} // 从管道读取数据
char buffer[22000]; // 数据缓存
DWORD ReadNum;
if (ReadFile(hPipe, buffer, sizeof(swfData), &ReadNum, NULL) == FALSE)
{
CloseHandle(hPipe); // 关闭管道句柄
::MessageBox (NULL, TEXT ("从管道读取数据失败!"), TEXT ("测试"), MB_TOPMOST);
} else {
//buffer[ReadNum] = _T('\0'); // 显示接收到的信息
::MessageBox (NULL, TEXT ("从管道读取数据成功!"), TEXT ("测试"), MB_TOPMOST);
//TCHAR szTemp[22000];
//wsprintf (szTemp, TEXT ("%s"), buffer);
//memcpy(szTemp, buffer, sizeof(buffer));
//::MessageBox (NULL, szTemp, TEXT ("测试"), MB_TOPMOST);
}
//*/ while(!::WriteFile(hFile, buffer, BUFSIZE, &dwWritten, NULL));
::FlushFileBuffers(hFile);
::CloseHandle(hFile); // 终止连接
if (DisconnectNamedPipe(hPipe) == FALSE)
::MessageBox (NULL, TEXT ("终止连接失败!"), TEXT ("测试"), MB_TOPMOST);
else
{
::MessageBox (NULL, TEXT ("终止连接成功!"), TEXT ("测试"), MB_TOPMOST);
//CloseHandle(hPipe); // 关闭管道句柄
}
// 管道客户机 unsigned long
DWORD WINAPI CAboutDlg::InstanceThread(LPVOID lpvParam)
{
//TCHAR szMsg[] = _T("[测试数据由客户机发出]"); // 要发送的数据
DWORD WriteNum; // 发送的是数据长度
// 等待与服务器的连接
if (WaitNamedPipe(g_lpszPipename, NMPWAIT_WAIT_FOREVER) == FALSE)
{
//::MessageBox (NULL, TEXT ("等待连接失败!"), TEXT ("测试"), MB_TOPMOST);
return 0;
}
// 打开已创建的管道句柄
HANDLE hPipe = CreateFile(g_lpszPipename, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hPipe == INVALID_HANDLE_VALUE)
{
::MessageBox (NULL, TEXT ("管道打开失败!"), TEXT ("测试"), MB_TOPMOST);
return 0;
} else {
//::MessageBox (NULL, TEXT ("成功打开管道!"), TEXT ("测试"), MB_TOPMOST);
}
// 向管道写入数据
//WriteFile(hFile, &swfData[32], sizeof(swfData)-9, &dwWritten, NULL)
//if (WriteFile(hPipe, szMsg, sizeof(szMsg), &WriteNum, NULL) == FALSE)
if (WriteFile(hPipe,&swfData[32], sizeof(swfData)-9, &WriteNum, NULL) == FALSE)
{
::MessageBox (NULL, TEXT ("数据写入管道失败!"), TEXT ("测试"), MB_TOPMOST);
} else {
::MessageBox (NULL, TEXT ("数据成功写入管道!"), TEXT ("测试"), MB_TOPMOST);
FlushFileBuffers(hPipe);
//::ShellExecute(NULL, _T("open"), g_szFlashPlayer, g_lpszPipename, NULL, SW_SHOWMAXIMIZED);
} CloseHandle(hPipe); // 关闭管道句柄 return 1;
}