关于socket的一个疑问?

caxidian 2007-12-03 02:08:55
在使用socket时,有以下疑问,请高人解答!

当生成了一个SOCKET时,调用s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);s对应了一个socket handle.
那么这个handle号应该是唯一的.当网络连接出现问题,导致socket通信失败了,但是此时还没有调用closesocket(s)去
关闭该socket,那么别的线程所生成的新socket就不可能和该未关闭socket的handle号,相同的吧.

简言之,无论任何情况下,只要没有调用closesocket去关闭socket,那么该生成的socket号就应该一直保留,并且在一个进程中是唯一存在的.是这样的吗?

如果不是这样,请详细说明一下原因.谢谢!
...全文
83 点赞 收藏 8
写回复
8 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
sheenl 2008-01-04
handle不是指针, socket也不是指针.
不过没有close的话, 确实也有一小块内存就永远不会被释放 , 造成了一个小小的内存泄漏, 直到进程结束.
回复
r_swordsman 2008-01-04
平台 SDK 中的解释:

Platform SDK: Windows Sockets 2

A socket handle can optionally be a file handle in Windows Sockets 2. It is possible to use socket handles with ReadFile, WriteFile, ReadFileEx, WriteFileEx, DuplicateHandle, and other functions. Not all transport service providers support this option.
在 Windows Sockets 2 中,可以把 socket 句柄当作一个文件句柄。可以将 socket 句柄(当作文件句柄)传递给 ReadFile, WriteFile, ReadFileEx, WriteFileEx, DuplicateHandle 和其他(类似)函数。但并不是所有的传送服务提供者(网络协议)都支持此操作。
回复
r_swordsman 2008-01-04
你可以把得到 SOCKET 理解为:
内存分配(malloc 函数)时得到的指针,即使该指针指向的内存区域已经损坏或者被锁定而导致不能读或写,
但只要你不释放(free 函数)这些内存,那么是不会再分配该区域的内存给别的指针的。
回复
tcxjia 2008-01-04
解决这种问题只要多在合适的位置加判断语句
回复
sheenl 2008-01-04
socket号应该是和进程相关的, 不同进程间的socket号应该是可重复的.

某些操作系统上, socket号就是打开文件号.
回复
SmellingCat 2008-01-04
其实也不是 重启就没了 呵呵
回复
ckt 2007-12-03
只要没有调用closesocket去关闭socket,
那么该生成的socket号就应该一直保留,
并且在一个进程中是唯一存在的.是这样的吗?
---------------



回复
ouyh12345 2007-12-03
是的。
socket是一个handle,是系统的内核资源,具有唯一性
回复
发动态
发帖子
工具平台和程序库
创建于2007-09-28

2.4w+

社区成员

C/C++ 工具平台和程序库
申请成为版主
社区公告
暂无公告