WSADuplicateSocket 谁有使用示例

yangsf5 2008-04-17 10:08:45
如题
...全文
481 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
jiyougang 2011-05-29
  • 打赏
  • 举报
回复
刚刚看到这个函数,还是不知道具体用来做什么 ,如果其中一个进程创建了SOCKET那么另一个进程岂不是可以随便接受?是不是必须那个进程也要调用这个函数呢
DebugFan 2011-04-07
  • 打赏
  • 举报
回复
每天回贴可得10分可用分
菜牛 2008-04-26
  • 打赏
  • 举报
回复
克隆的socket应该是无法区分的,既然服务器要区分,又为什么要用克隆的方法呢,直接创建两个socket不行吗?
yangsf5 2008-04-26
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 Mackz 的回复:]
至于WSADuplicateSocket的例子由于涉及两个进程的通讯,代码量比较多不好发,其实MSDN上WSADuplicateSocket函数的备注中已经很清晰描述了使用方法了。
[/Quote]

自己搞定了。。
其实我说的要个例子(vc版的),就是给个比msdn流程里更详细点的,例如,
1) WSASocket, WSAConnect这个第一步,我就不知道用socket直接创建可不可行。。
我的意思是,给的例子能讲到这点。。等等。。不需要能运行无误的。


现在不用了。。但是还有几个问题:
客户端的父进程WSADuplicateSocket,子进程用复制之后的套接字。。
子进程创建之后,服务器主要与子进程通信。。但也需定时给父进程发送消息。。
客户端怎么协调呢——怎么把相应的消息给相应的进程呢?
菜牛 2008-04-26
  • 打赏
  • 举报
回复
至于WSADuplicateSocket的例子由于涉及两个进程的通讯,代码量比较多不好发,其实MSDN上WSADuplicateSocket函数的备注中已经很清晰描述了使用方法了。
菜牛 2008-04-26
  • 打赏
  • 举报
回复
是否成功看函数返回值。
当然可以和Linux的socket通信,只要双方遵守同样的协议。
yangsf5 2008-04-26
  • 打赏
  • 举报
回复
WSAPROTOCOL_INFO wsai;
WSADuplicateSocket(s, childProcessID, &wsai);

设了断点。。看好像wsai没有获得成功。。
套接字是直接用socket创建的。。

在源进程和目标进程,是不是必须用WSASocket创建套接字?

用WSASocket创建的套接字能与linux的套接字通信么?
yangsf5 2008-04-26
  • 打赏
  • 举报
回复
哦,好的。。谢了。。

定时消息我在子进程接,再用管道到父进程。。

创建两个会损失服务器效率。
僵哥 2008-04-18
  • 打赏
  • 举报
回复
建议楼主参考Windows Platform SDK,或者可以下载MPICH2的Source进行研究
scq2099yt 2008-04-17
  • 打赏
  • 举报
回复
给个delphi的例子

// 发送方
New(lpProtocolInfo);
if WSADuplicateSocket(Session.s,WokeModeRec^.mProcessID,lpProtocolInfo)<>SOCKET_ERROR then
begin
Getmem(CopyData,sizeof(TCOPYDATASTRUCT));
CopyData.dwData:=2; // 文字消息
CopyData.cbData:=SizeOf(lpProtocolInfo^);
CopyData.lpData:=lpProtocolInfo;
Sendmessage(WokeModeRec^.mMainHandel,
WM_COPYDATA,
0,
LPARAM(CopyData));
FreeMem(CopyData);
end;
Dispose(lpProtocolInfo);
// 接收方
GetMem(pData,PCOPYDATASTRUCT(Msg.LParam)^.cbData);
CopyMemory(lpProtocolInfo,PCOPYDATASTRUCT(Msg.LParam)^.lpData,PCOPYDATASTRUCT(Msg.LParam)^.cbData);
FShareSocket := WSASocket(AF_INET, SOCK_STREAM, IPPROTO_IP, lpProtocolInfo, 0, WSA_FLAG_OVERLAPPED);
if (INVALID_SOCKET = FShareSocket) then
begin
Raise Exception.CreateFmt('%d',[WSAGetLastError]);
WSACleanup();
end;
FreeMem(pData);

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧