微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

确定socket和fd之间

如何解决确定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,这将返回误导性结果。另一个副作用是,如果它是文件,则将其刷新并更新其目录条目。总而言之,它可能很烂。我什至可以自己投票。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。