确定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
}
没有找到相关结果
已邀请:
4 个回复
佬棠
句柄用作文件的想法-如“套接字句柄”页面上明确指出的那样: 套接字句柄可以选择是Windows套接字2中的文件句柄。Winsock提供程序提供的套接字句柄可以与其他非Winsock函数一起使用,例如ReadFile,WriteFile,ReadFileEx和WriteFileEx。 无论如何,关于如何在Windows上区分它们,请参见函数NtQueryObject,如果传递给它的句柄是打开的
,它将返回return9的句柄名称。阅读“备注”部分以了解此调用返回的结构。 请注意,此方法仅适用于XP和更高版本,并且在Windows 2000上将失败(我认为它已经足够旧,不会影响您。)
陈獭
瞥同忙接
粱委教
警告:未经测试的理论和未经测试的依赖关系;-)请注意,如果用完fd \'s,这将返回误导性结果。另一个副作用是,如果它是文件,则将其刷新并更新其目录条目。总而言之,它可能很烂。我什至可以自己投票。