关于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号就应该一直保留,并且在一个进程中是唯一存在的.是这样的吗?

如果不是这样,请详细说明一下原因.谢谢!
...全文
133 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
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,是系统的内核资源,具有唯一性

24,860

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧