将套接字传递给子进程

时间:2014-01-09 16:01:14

标签: c++ visual-studio-2008

我的项目有两个程序:父母和孩子。

在Parent中:有一个套接字等待来自客户端的连接。当Parent接受连接时,它会生成Child进程并将套接字传递给Child。

SOCKET newSock = accept(listenSock, 0, 0);
char cmd[1024];
sprintf(cmd, "%s %d", "Child.exe", newSock);
result = CreateProcess( NULL, cmd, NULL, NULL, TRUE, CREATE_NEW_CONSOLE, NULL, NULL, &startupInfo, &processInformation);

客户端和子进程成功传输数据。

但是当我搜索谷歌时,有些人写道:必须调用函数WSADuplicateSocket(),然后将套接字传递给子进程。

请求帮我展示两种方式之间的差异? 如果我不调用WSADuplicateSocket()我的程序是否有任何错误?

2 个答案:

答案 0 :(得分:1)

嗯,对于初学者来说,Windows上的SOCKET是一个句柄(即一个指针),因此受32/64位字节大小的限制,因此如果您的应用运行,则%d是不够的在64位系统上。您必须使用%p代替。

除此之外,WSADuplicateSocket()是正确的方法。 MSDN说了很多:

Shared Sockets

  

引入了WSADuplicateSocket函数   启用跨进程的套接字共享。

答案 1 :(得分:0)

将CreateProcess中的参数bInheritHandles设置为TRUE,允许子进程获取所有可继承的句柄。套接字句柄是可继承的always。所以你不需要任何额外的电话。

仅当您没有继承处​​理时才需要WSADuplicateSocket(套接字是在子进程启动后创建的,或者bInheritHandles中的FALSECreateProcess