二个进程之间怎么传数据 一个进程接收,多个进程可发送数据到该进程,都在一台机子上不能用WINSOCK,我要怎么才能实现 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 WM_COPYDATA 消息可以,也可以使用命名管道或者内存映射文件实现;不过 WM_COPYDATA 消息是最简单的,它在内部也使用了内存映射文件实现。 可以使用 WM_COPYDATA 消息, 当然可以使用命名管道和内存映射文件;不过WM_COPYDATA 消息是最简单的,他在内部使用内存映射文件实现。 内存映射是最爽的了,然后随便发给消息给他,让他去读数据去WM_COPYDATA似乎只能读数据,不能写数据,我建议你最好使用内存映射,操作简单,使用方便,我们一直都用她 。 m_SuperIdler(闲人) :"如何一个映射我的是一个进程接收数据,可以不能写但有多个进程向这个收数据 的进程发送数据,因为都在同一机上,不能WINSOCK 用内存映射,不过要在dll文件中实现 为什么同一台机子不能用winsock? 记得以前有CSDN的朋友贴过,我记不得帖好了,代他贴一下我拷下的东西:在Win32下提供的进程间通信方式有以下几种: 剪贴板Clipboard:在16位时代常使用的方式,CWnd类中提供了支持。 COM/DCOM:通过COM系统的代理存根方式进行进程间数据交换,但只能够表现在对接口函数的调用时传送数据,通过DCOM可以在不同主机间传送数据。 Dynamic Data Exchange (DDE):在16位时代常使用的方式。 File Mapping:文件映射,在32位系统中提供的新方法,可用来共享内存。 Mailslots:邮件槽,在32位系统中提供的新方法,可在不同主机间交换数据,分为服务器方和客户方,双方可以通过其进行数据交换,在Win9X下只支持邮件槽客户。 Pipes:管道,分为无名管道:在父子进程间交换数据;有名管道:可在不同主机间交换数据,分为服务器方和客户方,在Win9X下只支持有名管道客户。 RPC:远程过程调用,很少使用,原因有两个:复杂而且与UNIX系统的RCP并不完全兼容。但COM/DCOM的调用是建立在RPC的基础上的。 Windows Sockets:网络套接口,可在不同主机间交换数据,分为服务器方和客户方。(相关介绍见Visual C++/MFC入门教程 第六章 网络通信开发) WM_COPYDATA:通过发送WM_COPYDATA消息并将数据放在参数中来传递数据给其他进程。 创建命名管道时需要指定一个主机名和管道名,对于客户端来说可以是如下格式:\\[host_name]\pipe\[pipe_name]\也可以是\\.\pipe\pipe_name\其中.表示本机。而服务器端只能够在指定本机作为主机名,即只能使用下面的格式:\\.\pipe_name\。此外需要记住,在同一主机上管道名称是唯一的,一个命名管道一旦被创建就不允许相同名称的管道再被创建。 服务器方通过: HANDLE CreateNamedPipe(LPCTSTR lpName, // pipe nameDWORD dwOpenMode, // pipe open modeDWORD dwPipeMode, // pipe-specific modesDWORD nMaxInstances, // maximum number of instancesDWORD nOutBufferSize, // output buffer sizeDWORD nInBufferSize, // input buffer sizeDWORD nDefaultTimeOut, // time-out intervalLPSECURITY_ATTRIBUTES lpSecurityAttributes // SD);创建命名管道和打开已经存在的命名管道,其中lpName为管道名称,dwOpenMode为创建方式,可以是下面值的组合: PIPE_ACCESS_INBOUND:管道只能用作接收数据。 PIPE_ACCESS_OUTBOUND:管道只能用作发送数据。 PIPE_ACCESS_DUPLEX:管道既可以发送也可以接收数据。(上面这三个值只能够取其中一个) FILE_FLAG_WRITE_THROUGH:管道用于同步发送和接收数据,只有在数据被发送到目标地址时发送函数才会返回,如果不设置这个参数那么在系统内部对于命名管道的处理上可能会因为减少网络附和而在数据积累到一定量时才发送,并且对于发送函数的调用会马上返回。 FILE_FLAG_OVERLAPPED:管道可以用于异步输入和输出,异步读写的有关方法和文件异步读写是相同的。 dwPipeMode指定管道类型,可以是下面值的组合: PIPE_TYPE_BYTE:数据在通过管道发送时作为字节流发送,不能与PIPE_READMODE_MESSAGE共用。 PIPE_TYPE_MESSAGE:数据在通过管道发送时作为消息发送,不能与PIPE_READMODE_BYTE共用。 PIPE_READMODE_BYTE:在接收数据时接收字节流。 PIPE_READMODE_MESSAGE:在接收数据时接收消息。 PIPE_WAIT:使用等待模式,在读,写和建立连接时都需要管道的另一方完成相应动作后才会返回。 PIPE_NOWAIT:使用非等待模式,在读,写和建立连接时不需要管道的另一方完成相应动作后就会立即返回。 nMaxInstances为管道的的最大数量,在第一次建立服务器方管道时这个参数表明该管道可以同时存在的数量。PIPE_UNLIMITED_INSTANCES表明不对数量进行限制。nOutBufferSize和nInBufferSize表示缓冲区的大小。nDefaultTimeOut表示在等待连接时最长的等待时间(以毫秒为单位),如果在创建时设置为NMPWAIT_USE_DEFAULT_WAIT表明无限制的等待,而以后服务器方的其他管道实例也需要设置相同的值。lpSecurityAttributes为安全属性,一般设置为NULL。如果创建或打开失败则返回INVALID_HANDLE_VALUE。可以通过GetLastError得到错误。 客户方通过: HANDLE CreateFile(LPCTSTR lpFileName, // file nameDWORD dwDesiredAccess, // access modeDWORD dwShareMode, // share modeLPSECURITY_ATTRIBUTES lpSecurityAttributes, // SDDWORD dwCreationDisposition, // how to createDWORD dwFlagsAndAttributes, // file attributesHANDLE hTemplateFile // handle to template file);创建客户端命名管道,CreateFile可以有很多用途,可以用来创建文件,管道,邮件槽,目录等,这里介绍用CreateFile来打开客户端命名管道。lpFileName用来指明管道名称。dwDesiredAccess用来表明使用方式,可以使用下面的值: GENERIC_READ:打开一个只用于读的管道。 GENERIC_WRITE:打开一个只用于写的管道。 GENERIC_READ | GENERIC_WRITE:打开一个用于读和写的管道。 dwShareMode指定共享方式,一般指定为0,lpSecurityAttributes为安全属性,一般设置为NULL,dwCreationDisposition设置为OPEN_EXISTING,dwFlagsAndAttributes设置为FILE_ATTRIBUTE_NORMAL,此外可以还设置为FILE_FLAG_OVERLAPPED来进行异步通讯,hTemplateFile设置为NULL。如果打开失败则返回INVALID_HANDLE_VALUE。可以通过GetLastError得到错误。 此外客户方可以利用: BOOL CallNamedPipe(LPCTSTR lpNamedPipeName, // pipe nameLPVOID lpInBuffer, // write bufferDWORD nInBufferSize, // size of write bufferLPVOID lpOutBuffer, // read bufferDWORD nOutBufferSize, // size of read bufferLPDWORD lpBytesRead, // number of bytes readDWORD nTimeOut // time-out value);来创建一个发送消息的管道。 管道的连接管理,客户方在调用CreateFile后立即就能够建立服务器的连接,而服务器方一旦管道打开或创建后可以用 BOOL ConnectNamedPipe(HANDLE hNamedPipe, // handle to named pipeLPOVERLAPPED lpOverlapped // overlapped structure);来等待客户端的连接建立。如果希望在服务器方检测是否有连接到达,可以调用 BOOL WaitNamedPipe(LPCTSTR lpNamedPipeName, // pipe nameDWORD nTimeOut // time-out interval);这里的lpNamePipeName直接使用创建管道时的名称,如果在服务器方希望关闭连接则调用 BOOL DisconnectNamedPipe(HANDLE hNamedPipe // handle to named pipe);一旦连接被关闭,服务器方可以再次调用ConnectNamedPipe来建立连接。如果要关闭管道则直接调用CloseHandle。请注意这里提到的关闭管道和关闭连接是不同的意思,在同一个管道上可以依次反复建立连接,而且可以减小系统的负荷。而且如果指定了管道最大数量限制那么在打开的管道达到最大限制后如果不关闭旧管道就无法打开新管道。 对于客户方则无法关闭连接,而只能直接调用CloseHandle关闭管道。 数据的发送,不论是服务器还是客户方都可以通过ReadFile和WriteFile进行管道读写来达到通讯的目的。 下面是一个例子,服务器方创建或打开一个管道并读入对方发送的数据,将小写字母转换成大写字母后返回,而客户发创建一个到服务器的连接并发送一个字符串并读回经过转换的数据: 在使用这个例子时,运行三个服务端进程,而运行第四个时会因为达到管道数量限制而打开管道失败。 //服务方void CNamed_pipeDlg::OnCreateP() {DWORD dwTO = NMPWAIT_USE_DEFAULT_WAIT;//设置连接等待时间HANDLE hSvr = CreateNamedPipe("\\\\.\\pipe\\test_pipe\\",PIPE_ACCESS_DUPLEX,PIPE_TYPE_BYTE,3,256,256,dwTO,NULL);if( INVALID_HANDLE_VALUE == hSvr){AfxMessageBox("Error create/open pipe");}else{if (ConnectNamedPipe(hSvr,NULL)){BYTE bRead;DWORD dwRead,dwWritten;while (ReadFile(hSvr,&bRead,1,&dwRead,NULL)){if(bRead >= 'a' && bRead $lt;='z')bRead = 'A'+ (bRead-'a');WriteFile(hSvr,&bRead,1,&dwWritten,NULL);}}else{AfxMessageBox("error when waiting connected");}CloseHandle(hSvr);}}//客户端void CNamed_pipe_cDlg::OnConn() {HANDLE hClient = CreateFile("\\\\.\\pipe\\test_pipe\\",GENERIC_WRITE |GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);if(hClient == INVALID_HANDLE_VALUE){AfxMessageBox("Error open pipe");}else{DWORD dwRead,dwWritten;char szSend[10]="send...";char szRecv[10];for(int i=0;i<strlen(szSend)+1;i++){WriteFile(hClient,szSend+i,1,&dwWritten,NULL);ReadFile(hClient,szRecv+i,1,&dwRead,NULL);}CloseHandle(hClient);//close pipeAfxMessageBox(szRecv);}} zhang1000(多一个零):file map怎么用,怎么在我的MSDN中找不到 搞定了吗?File Mapping function:CreateFileMapping()...MapViewOfFile().........UnmapViewOfFile()...CloseHandle()........ 如何在文本框中显示系统时间,精确到毫秒 CString转换为const WCHAR * 先谢过。。。。 静态窗口绘图 在VC中播放ppt文件 用VC(版本不限)能做出OFFICE2007的界面吗? 按回车为何关闭对话框 有人做过数字证书方面的东西吗?----请进! 关于Base64编码实现的问题 皮肤技术如何实现? 求解一个CScrollView的问题,首先解决问题者给分!!! 有关多进程访问数据库的互斥问题。 关机时系统发送什么消息给应用程序,我想用自己的程序接收这个消息,然后进行一些处理,再关机,应该如何做呢?
WM_COPYDATA似乎只能读数据,不能写数据,我建议你最好使用内存映射,操作简单,使用方便,我们一直都用她 。
如何一个映射
我的是一个进程接收数据,可以不能写
但有多个进程向这个收数据 的进程发送数据,
因为都在同一机上,不能WINSOCK
在Win32下提供的进程间通信方式有以下几种: 剪贴板Clipboard:在16位时代常使用的方式,CWnd类中提供了支持。
COM/DCOM:通过COM系统的代理存根方式进行进程间数据交换,但只能够表现在对接口函数的调用时传送数据,通过DCOM可以在不同主机间传送数据。
Dynamic Data Exchange (DDE):在16位时代常使用的方式。
File Mapping:文件映射,在32位系统中提供的新方法,可用来共享内存。
Mailslots:邮件槽,在32位系统中提供的新方法,可在不同主机间交换数据,分为服务器方和客户方,双方可以通过其进行数据交换,在Win9X下只支持邮件槽客户。
Pipes:管道,分为无名管道:在父子进程间交换数据;有名管道:可在不同主机间交换数据,分为服务器方和客户方,在Win9X下只支持有名管道客户。
RPC:远程过程调用,很少使用,原因有两个:复杂而且与UNIX系统的RCP并不完全兼容。但COM/DCOM的调用是建立在RPC的基础上的。
Windows Sockets:网络套接口,可在不同主机间交换数据,分为服务器方和客户方。(相关介绍见Visual C++/MFC入门教程 第六章 网络通信开发)
WM_COPYDATA:通过发送WM_COPYDATA消息并将数据放在参数中来传递数据给其他进程。
创建命名管道时需要指定一个主机名和管道名,对于客户端来说可以是如下格式:\\[host_name]\pipe\[pipe_name]\也可以是\\.\pipe\pipe_name\其中.表示本机。而服务器端只能够在指定本机作为主机名,即只能使用下面的格式:\\.\pipe_name\。此外需要记住,在同一主机上管道名称是唯一的,一个命名管道一旦被创建就不允许相同名称的管道再被创建。 服务器方通过: HANDLE CreateNamedPipe(
LPCTSTR lpName, // pipe name
DWORD dwOpenMode, // pipe open mode
DWORD dwPipeMode, // pipe-specific modes
DWORD nMaxInstances, // maximum number of instances
DWORD nOutBufferSize, // output buffer size
DWORD nInBufferSize, // input buffer size
DWORD nDefaultTimeOut, // time-out interval
LPSECURITY_ATTRIBUTES lpSecurityAttributes // SD
);
创建命名管道和打开已经存在的命名管道,其中lpName为管道名称,dwOpenMode为创建方式,可以是下面值的组合:
PIPE_ACCESS_INBOUND:管道只能用作接收数据。
PIPE_ACCESS_OUTBOUND:管道只能用作发送数据。
PIPE_ACCESS_DUPLEX:管道既可以发送也可以接收数据。(上面这三个值只能够取其中一个)
FILE_FLAG_WRITE_THROUGH:管道用于同步发送和接收数据,只有在数据被发送到目标地址时发送函数才会返回,如果不设置这个参数那么在系统内部对于命名管道的处理上可能会因为减少网络附和而在数据积累到一定量时才发送,并且对于发送函数的调用会马上返回。
FILE_FLAG_OVERLAPPED:管道可以用于异步输入和输出,异步读写的有关方法和文件异步读写是相同的。
dwPipeMode指定管道类型,可以是下面值的组合:
PIPE_TYPE_BYTE:数据在通过管道发送时作为字节流发送,不能与PIPE_READMODE_MESSAGE共用。
PIPE_TYPE_MESSAGE:数据在通过管道发送时作为消息发送,不能与PIPE_READMODE_BYTE共用。
PIPE_READMODE_BYTE:在接收数据时接收字节流。
PIPE_READMODE_MESSAGE:在接收数据时接收消息。
PIPE_WAIT:使用等待模式,在读,写和建立连接时都需要管道的另一方完成相应动作后才会返回。
PIPE_NOWAIT:使用非等待模式,在读,写和建立连接时不需要管道的另一方完成相应动作后就会立即返回。
nMaxInstances为管道的的最大数量,在第一次建立服务器方管道时这个参数表明该管道可以同时存在的数量。PIPE_UNLIMITED_INSTANCES表明不对数量进行限制。nOutBufferSize和nInBufferSize表示缓冲区的大小。nDefaultTimeOut表示在等待连接时最长的等待时间(以毫秒为单位),如果在创建时设置为NMPWAIT_USE_DEFAULT_WAIT表明无限制的等待,而以后服务器方的其他管道实例也需要设置相同的值。lpSecurityAttributes为安全属性,一般设置为NULL。如果创建或打开失败则返回INVALID_HANDLE_VALUE。可以通过GetLastError得到错误。
客户方通过: HANDLE CreateFile(
LPCTSTR lpFileName, // file name
DWORD dwDesiredAccess, // access mode
DWORD dwShareMode, // share mode
LPSECURITY_ATTRIBUTES lpSecurityAttributes, // SD
DWORD dwCreationDisposition, // how to create
DWORD dwFlagsAndAttributes, // file attributes
HANDLE hTemplateFile // handle to template file
);
创建客户端命名管道,CreateFile可以有很多用途,可以用来创建文件,管道,邮件槽,目录等,这里介绍用CreateFile来打开客户端命名管道。lpFileName用来指明管道名称。dwDesiredAccess用来表明使用方式,可以使用下面的值:
GENERIC_READ:打开一个只用于读的管道。
GENERIC_WRITE:打开一个只用于写的管道。
GENERIC_READ | GENERIC_WRITE:打开一个用于读和写的管道。
dwShareMode指定共享方式,一般指定为0,lpSecurityAttributes为安全属性,一般设置为NULL,dwCreationDisposition设置为OPEN_EXISTING,dwFlagsAndAttributes设置为FILE_ATTRIBUTE_NORMAL,此外可以还设置为FILE_FLAG_OVERLAPPED来进行异步通讯,hTemplateFile设置为NULL。如果打开失败则返回INVALID_HANDLE_VALUE。可以通过GetLastError得到错误。
此外客户方可以利用: BOOL CallNamedPipe(
LPCTSTR lpNamedPipeName, // pipe name
LPVOID lpInBuffer, // write buffer
DWORD nInBufferSize, // size of write buffer
LPVOID lpOutBuffer, // read buffer
DWORD nOutBufferSize, // size of read buffer
LPDWORD lpBytesRead, // number of bytes read
DWORD nTimeOut // time-out value
);
来创建一个发送消息的管道。
管道的连接管理,客户方在调用CreateFile后立即就能够建立服务器的连接,而服务器方一旦管道打开或创建后可以用 BOOL ConnectNamedPipe(
HANDLE hNamedPipe, // handle to named pipe
LPOVERLAPPED lpOverlapped // overlapped structure
);
来等待客户端的连接建立。如果希望在服务器方检测是否有连接到达,可以调用
BOOL WaitNamedPipe(
LPCTSTR lpNamedPipeName, // pipe name
DWORD nTimeOut // time-out interval
);这里的lpNamePipeName直接使用创建管道时的名称,如果在服务器方希望关闭连接则调用
BOOL DisconnectNamedPipe(
HANDLE hNamedPipe // handle to named pipe
);一旦连接被关闭,服务器方可以再次调用ConnectNamedPipe来建立连接。如果要关闭管道则直接调用CloseHandle。请注意这里提到的关闭管道和关闭连接是不同的意思,在同一个管道上可以依次反复建立连接,而且可以减小系统的负荷。而且如果指定了管道最大数量限制那么在打开的管道达到最大限制后如果不关闭旧管道就无法打开新管道。 对于客户方则无法关闭连接,而只能直接调用CloseHandle关闭管道。 数据的发送,不论是服务器还是客户方都可以通过ReadFile和WriteFile进行管道读写来达到通讯的目的。 下面是一个例子,服务器方创建或打开一个管道并读入对方发送的数据,将小写字母转换成大写字母后返回,而客户发创建一个到服务器的连接并发送一个字符串并读回经过转换的数据: 在使用这个例子时,运行三个服务端进程,而运行第四个时会因为达到管道数量限制而打开管道失败。 //服务方
void CNamed_pipeDlg::OnCreateP()
{
DWORD dwTO = NMPWAIT_USE_DEFAULT_WAIT;//设置连接等待时间
HANDLE hSvr = CreateNamedPipe("\\\\.\\pipe\\test_pipe\\",PIPE_ACCESS_DUPLEX,PIPE_TYPE_BYTE,3,256,256,dwTO,NULL);
if( INVALID_HANDLE_VALUE == hSvr)
{
AfxMessageBox("Error create/open pipe");
}
else
{
if (ConnectNamedPipe(hSvr,NULL))
{
BYTE bRead;
DWORD dwRead,dwWritten;
while (ReadFile(hSvr,&bRead,1,&dwRead,NULL))
{
if(bRead >= 'a' && bRead $lt;='z')
bRead = 'A'+ (bRead-'a');
WriteFile(hSvr,&bRead,1,&dwWritten,NULL);
}
}
else
{
AfxMessageBox("error when waiting connected");
}
CloseHandle(hSvr);
}
}
//客户端
void CNamed_pipe_cDlg::OnConn()
{
HANDLE hClient = CreateFile("\\\\.\\pipe\\test_pipe\\",GENERIC_WRITE |GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if(hClient == INVALID_HANDLE_VALUE)
{
AfxMessageBox("Error open pipe");
}
else
{
DWORD dwRead,dwWritten;
char szSend[10]="send...";
char szRecv[10];
for(int i=0;i<strlen(szSend)+1;i++)
{
WriteFile(hClient,szSend+i,1,&dwWritten,NULL);
ReadFile(hClient,szRecv+i,1,&dwRead,NULL);
}
CloseHandle(hClient);//close pipe
AfxMessageBox(szRecv);
}
}
file map怎么用,怎么在我的MSDN中找不到
File Mapping function:
CreateFileMapping()...
MapViewOfFile()...
......
UnmapViewOfFile()...
CloseHandle()...
.....