我的项目有两个程序:父母和孩子。
在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()我的程序是否有任何错误?
答案 0 :(得分:1)
嗯,对于初学者来说,Windows上的SOCKET
是一个句柄(即一个指针),因此受32/64位字节大小的限制,因此如果您的应用运行,则%d
是不够的在64位系统上。您必须使用%p
代替。
除此之外,WSADuplicateSocket()
是正确的方法。 MSDN说了很多:
引入了WSADuplicateSocket函数 启用跨进程的套接字共享。
答案 1 :(得分:0)
将CreateProcess中的参数bInheritHandles
设置为TRUE,允许子进程获取所有可继承的句柄。套接字句柄是可继承的always。所以你不需要任何额外的电话。
仅当您没有继承处理时才需要WSADuplicateSocket(套接字是在子进程启动后创建的,或者bInheritHandles
中的FALSE
是CreateProcess
)