我有个疑问,就是客户端的SOCKET使用CONNECT的时候,服务器端的LISTEN SOCKET 的ONACCEPT后调用ACCEPT的时候,初始化那个SOCKET的时候做了哪些工作,那个对应的SOCKET会重新占用一个端口吗,如果不是,它会使用那个LISTEN socket来进行收发数据吗?我始终就不明白,本来是SOCKET接收到客户端的连接请求,它怎么能“转交”给另一个SOCKET,谢谢您解答了
解决方案 »
- 几个子对话框之间交换数据
- 关于const,和sendmessage的用法问题
- 如何把一个string 变量 转化为 Ado的字符串:m_Res_pRecordset->PutCollect("测站点",??(stirng1));
- 还是关于分割窗体的问题!~(高人请进)
- 任务管理器中的句柄数是什么意思?程序造成句柄数一直增加是怎么回事?
- 怎么样查看DLL的内容?
- 感谢各位刚才鼎力相助,再紧急请教两个与DataGrid有关问题!
- 关于用IE调用ActiveX控件的问题
- listbox选中某项编辑框中数值显示上一次输入的值
- mfc怎么随机生成200个黑点?
- 程序中如何把某个文件拷贝到另一台机器上(该机器不开完全共享)?
- 高分。。。低能。。。问题~~~
看函数原型就知道SOCKET accept(......)
转交:
具体不知道,估计象客户端connect之前做的工作类似吧
accept:
SOCKET a;
a=socket;
bind(a,...)
类似connect的另一个内部函数将a与客户端socket连接起来
return a;那个对应的SOCKET会重新占用一个端口吗:
应该会使用非listen port外的另一个临时port
收发数据:
当然是用accept返回的SOCKET
“转交”给另一个SOCKET:
实际上是建立了一个SOCKET,客户端SOCKET是与新建的SOCKET连接在一起。
这点在server端监测网络连接断开时可知:
你并没有用listen socket监测断开,而是用accept返回的SOCKET监测.
并不会对这个新的SOCKET进行bind
int SocketConnect = accept(socketRoot);
accept 前,是socketRoot读写数据的了,
accept 后,就变成SocketConnect 读写数据的,我随便说说的,错了别怪我的
你说服务端对应的SOCKET不占用端口,那么它发送数据的时候,从哪里发,是通过LISTEN SOCKET吗,发送的数据中有那四个标识吗,另外客户端的SOCKET是应该有这四个标识的,那它的远端端口怎么写,还是LISTEN SOCKET的吗,如果是,那数据来了的时候应该首先是LISTEN SOCKET知道,那它如何把它“转交”给服务端另外一个对应的SOCKET,我的想法是,当LISTEN SOCKET ACCEPT后,转交给另外一个SOCKET的时候,客户端的SOCKET那四个标识会作一些变动,如远端的PORT
上述的另一个端口可能是错的。
通过在connect后使用getpeername取对端连接数据看端口就是连接的端口。
这样我就不明白一点:
当server使用a port时
1、客户端本身指定a port连接是失败的。
2、两个客户端都指定b port连接后一个客户端是不能连接的,
实际上都是在bind时就错了
不过按batizhou(batizhou)说的倒是可以理解。“当LISTEN SOCKET ACCEPT后,转交给另外一个SOCKET的时候,客户端的SOCKET那四个标识会作一些变动,如远端的PORT“:
按batizhou(batizhou)的说法,客户端的四个标识就不用变了:远端地址还是server IP,远端端口还是 server Port,本地自然不变了
shuofa