确定描述符是Windows上的套接字还是常规文件?

时间:2016-09-05 14:36:02

标签: c windows file sockets

我已阅读此帖Determine between socket and fd,答案建议创建一个包含两个字段的结构,是否有另一种方法可以测试描述符是Windows上的套接字还是常规文件?

2 个答案:

答案 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编写的代码。