我已阅读此帖Determine between socket and fd,答案建议创建一个包含两个字段的结构,是否有另一种方法可以测试描述符是Windows上的套接字还是常规文件?
答案 0 :(得分:1)
您可以尝试一些只能在套接字上工作的东西,看看它是否因ENOTSOCK而失败。例如getsockname()
。
答案 1 :(得分:0)
这可能会有所帮助:
用套接字替换 stdin stdout stderr ...
http://www6.uniovi.es/cscene/CS5/CS5-05.html
int exec_comm_handler( int sck )
{
close(0); /* close standard input */
close(1); /* close standard output */
close(2); /* close standard error */
if( dup(sck) != 0 || dup(sck) != 1 || dup(sck) != 2 ) {
perror("error duplicating socket for stdin/stdout/stderr");
exit(1);
}
printf("this should now go across the socket...\n");
execl( "/bin/sh", "/bin/sh", "-c", "/path/to/redirected_program" );
perror("the execl(3) call failed.");
exit(1);
}
我们的'comm handler'首先关闭标准输入的文件描述符, 标准输出和标准错误。然后使用dup(2)复制 套接字文件句柄。 dup(2)将复制给定的文件描述符 并将副本作为下一个可用描述符返回。从0,1开始, 和2是下一个可用的描述符,它们应该是返回的 重复。现在stdin / stdout / stderr [0/1/2]上的操作将起作用 在socket上而不是原始的stdin / stdout / stderr。
我不知道这种技术(在套接字文件上调用dup(2) 描述符)可能直到看到Martin Mares编写的代码。