确定socket和fd之间

| 在Unix上,Win32不支持函数
read()
write()
close()
的文件方法。 我想模拟它,但不知道如何区分WinSocks2上的
sock
是socket还是fd。
//returns 1 if `sock` is network socket, 
//        0 if `sock` is file desriptor (including stdio, stderr, stdout), ...
//       -1 in none of above
int is_net_socket(int sock)
{
    // ...?
}
这应该按以下方式工作:
int mysock  = socket(PF_INET, SOCK_STREAM, 0);
int myfd    = _open(\"my_file.txt\", _O_RDONLY);

printf(\"1: %d    2: %d    3: %d    4:%d\\n\",
       is_net_socket(mysock),   //1
       is_net_socket(myfd),     //0
       is_net_socket(stdin),    //0
       is_net_socket(stderr));  //0

// should print \"1: 1    2: 0    3: 0    4:0\"
如何实现ѭ6以便按以下方式使用它:
int my_close(int sock)
{
#if ON_WINDOWS
    switch( is_net_socket(sock) ) {
        case 1: return closesocket(sock);
        case 0: return _close(sock);
        default: //handle error...
    }
#else
    return close(sock);
#endif
}
    
已邀请:
        不确定Windows不允许您将
SOCKET
句柄用作文件的想法-如“套接字句柄”页面上明确指出的那样:   套接字句柄可以选择是Windows套接字2中的文件句柄。Winsock提供程序提供的套接字句柄可以与其他非Winsock函数一起使用,例如ReadFile,WriteFile,ReadFileEx和WriteFileEx。 无论如何,关于如何在Windows上区分它们,请参见函数NtQueryObject,如果传递给它的句柄是打开的
SOCKET
,它将返回return9的句柄名称。阅读“备注”部分以了解此调用返回的结构。 请注意,此方法仅适用于XP和更高版本,并且在Windows 2000上将失败(我认为它已经足够旧,不会影响您。)     
        我想您可以使用select查询套接字的状态。 http://msdn.microsoft.com/zh-cn/library/ms740141%28VS.85%29.aspx 我建议将文件desc和套接字分组在一个结构中。您可以声明一个枚举,以告知描述符是文件还是套接字。我知道这可能不会像您想要的那样动态,但是通常在创建可移植应用程序时,最好将这些细节抽象掉。 例:
enum type { SOCKET, FILE };

typedef struct
{
    unsigned int id;
    type dataType;
} descriptor_t;

int close(descriptor_t sock)
{
#if WIN32
    if (sock.dataType == SOCKET)
        return closesocket(sock.id);
    else
        return _close(sock.id);
#else
    return close(sock.id);
#endif
}
    
        我怀疑...但是我不确定Windows上的fds和套接字使用单独的名称空间。因此,套接字和文件的编号可能是相同的,并且在调用ѭ6is时无法知道正在谈论的是哪个。 尝试打印出套接字和fd编号,以查看它们是否同时相同。     
        如果Windows \'C \'库具有dup(),则可以尝试将其复制,这对于套接字应失败,但对于文件fd则应成功。所以:
int is_net_socket(fd)
{
  return close(dup(fd)) != 0;
}
警告:未经测试的理论和未经测试的依赖关系;-)请注意,如果用完fd \'s,这将返回误导性结果。另一个副作用是,如果它是文件,则将其刷新并更新其目录条目。总而言之,它可能很烂。我什至可以自己投票。     

要回复问题请先登录注册