如何解决确定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 举报,一经查实,本站将立刻删除。