社区
网络编程
帖子详情
TCP closesocket 疑问
sssxueren
2003-02-26 04:42:13
请问,TCP连接下,服务器端发送完数据,马上closesocket,这样客户端可以保证在收到数据以后才得到服务器断开连接的消息(recv == 0)吗?
...全文
45
9
打赏
收藏
TCP closesocket 疑问
请问,TCP连接下,服务器端发送完数据,马上closesocket,这样客户端可以保证在收到数据以后才得到服务器断开连接的消息(recv == 0)吗?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
9 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
sssxueren
2003-02-28
打赏
举报
回复
thanks
JoeRen
2003-02-27
打赏
举报
回复
sssxueren(xueren)的方法也是可行的。不过不必给客户端发0长度的消息,调用shutdown就可以了。服务端可以在接受0长度消息之后closesocket
另外,如果发0长度的消息给客户端,是不能关闭连接的。因为该消息根本不会发出。倒是可以调用一个叫WSASendDisconnect的函数来关闭连接,但是经我试验,它不会像预想的那样发送一堆数据之后断开,而是等价于shutdown(socket,SD_SEND).MSDN的说法是,只有在支持断开数据的协议上才允许连带发出数据。那么看来是TCP不支持断开数据了
sssxueren
2003-02-27
打赏
举报
回复
因为客户端不知道数据量有多少啊,如果要一个end msg的话,感觉会不会多此一举的阿,shutdown()我也知道,用那个表示服务器不发送数据,是不是也会给客户端发一条0长度的消息,然后客户端closesocket,服务器又接到0长度的消息,再closesocket呢?
sevencat
2003-02-27
打赏
举报
回复
把这个选项看懂了SO_LINGER
估计也没什么问题了。
CLOSESOCKET后一般不会立即关闭的。
phalcon
2003-02-27
打赏
举报
回复
这里讨论的也是有关于close socket的问题 各位帮忙看看
http://expert.csdn.net/Expert/topic/1464/1464830.xml?temp=.3935511
core
2003-02-27
打赏
举报
回复
没有问题
前提是不要设置SO_LINGER的套接字选项,使用建立连接时的默认值就可以了
chen_jun_fen
2003-02-26
打赏
举报
回复
不能这样来断接的,
应该是客户端收到数据后,主动断接,然后服务段收到FD_CLOSE消息后,才可以closesocket
lbird
2003-02-26
打赏
举报
回复
如果是服务器端发送完数据,当然可以。
你要保证据的安全接收可以用从容关闭shutdown()
likebj
2003-02-26
打赏
举报
回复
不可以吧,那要是数据传丢了呢?而且如果这个连接已经断开,而数据还没有到客户端,那肯定是丢了
飞鸽传书(IPMessenger) 源码
软件简介 飞鸽传书(IP Messenger),是由日本人Shirouzu Hiroaki (白水 启章)所发明的免费软件, 是一款局域网内即时通信软件,基于
TCP
/IP(UDP)。可运行于多种操作平台(Win/Mac/UNIX/Java),并实现跨平台信息交流。不需要服务器支持, 支持文件/文件夹的传送 (2.00版以上),通讯数据采用 RSA/Blofish 加密 (2.00版以上),十分小巧,简单易用,而且你可以完全免费使用它。目前已有的版本包括: Win32, Win16, MacOS, MacOSX, X11, GTK, GNOME,Java 等, 并且公开源代码. 系统要求 Microsoft Windows 95/98/Me/NT4.0/2000/XP/2003 95/98/NT4.0 ... 要求 comctl32.dll(公共控件) 的版本为 5.x 或更高. (如果你安装的 IE 是 5.x 或更高版本, 那么就不必担心这个问题了) 注意: Windows 3.1(和 NT3.5x), 请使用 IP Messenger for Win16. 使用说明 < 安装/卸载 > 执行 setup.exe 你可以将 IPMsg 安装到指定目录, 或者重新注册到启动组. 如果需要删除 IPMsg, 请先从控制面板中卸载, 再手动删除 IPMsg 目录. < 系统托盘区图标 > 左键双击图标, 即可打开发送消息窗口. 右键点击图标, 可进入 [服务设置], [离开] 等. < 发送消息窗口 > - 发送消息时, 若勾选了 [封装], 则接收者要先打开信封才能看到消息, 如果你还勾选了 [上锁], 则接收者在打开信封时还需要输入密码. (密码是由接收者自己在 [服务设置] 中设置的) - 若要发送文件/文件夹, 可直接将文件/文件夹拖入发送消息窗口 或在发送消息窗口上点击右键, 再选择发送文件或发送文件夹 - 传送文件/文件夹时, 当接收者还没有保存(下载)文件/文件夹时, 若发送者关闭或重启了 IPMsg, 则附带的文件信息将被清除, 接收者将不能继续接收(下载)到此文件. - 用户列表前缀符号说明 ":" 表示用户处于离开模式. "|" 表示用户使用的不是 2.0 以上版本的 IPMsg, 将不支持文件/文件夹的传送, 并且不支持通信数据加密. "|"(短线) 表示只支持文件/文件夹的传送. - 拖动列表表头标题项可改变其顺序, 并可点击右键选择"保存列表顺序" - 在消息输入窗口中, 可使用 Ctrl+Tab 输入制表符 Tab. - 在发送消息窗口上点击右键, 可以进入设置显示优先级, 选择工作组, 搜索用户(Ctrl+F), 传送文件, 传送文件夹, 保存列表顺序, 字体设置, 窗口大小设置, 固定窗口位置, 列表显示设置. - 在用户名上点击右键, 可设置其显示优先级 优先级按由小到大的顺序排序 - 通过设置显示优先级, 可将经常联系的用户至于列表顶端, 或者隐藏不需要联系的用户 < 接收消息窗口 > - 在接收消息窗口上点击右键, 可以进入字体设置, 窗口大小设置, 固定窗口位置. - 接收消息窗口标题栏中的 "+" 或 "-" 表示通信数据使用了加密算法 "+" 表示 RSA/1024 位, blowfish/128 位加密 "-" 表示 RSA/512 位, RC2/40 位加密 - 如果你收到的消息附带了文件, 将会显示出附件按钮. 点击按钮即可保存文件. < 其他 > - 如果需要(通过路由器)连接到广域网, 则需要设置广播地址. 详见广域网设置(广播设置) - 其它功能都很容易理解, 你试一试就明白了 操作技巧 1、隐藏/显示窗口Ctrl+D 2、按住Ctrl键再点[刷新]可保持现有用户,搜索新上线的用户 3、打开发送/接收消息窗口Ctrl+Alt+S/R(需要进行详细设置) 4、打开搜索窗口Ctrl+F 5、接收到多个文件,保存时可勾选[全部] 软件原理 局域网聊天软件飞鸽传书是目前比较流行的局域网即时通讯软件,由于历史悠久,它具有比较多的用户。 因为 FreeEIM 的实现原理和飞鸽传书差不多,希望广大用户了解其原理后,在使用时更加得心应手。 开发多年的飞鸽,在他的基础上增加了些许功能,例如语音对话,这里继续讨论FreeEIM(飞鸽传书),前几天,详细的了解了FreeEIM(飞鸽传书)的网络协议,详细分析并且实现了FreeEIM(飞鸽传书)的消息传递过程,这里就FreeEIM(飞鸽传书)中的文件和文件夹的传输做详细的说明。 在FreeEIM(飞鸽传书)中,如果要进行文件或者文件夹的传输,首先需要做的就是消息的应答,通过UDP发送文件传输报文,另外的FreeEIM(飞鸽传书)客户端收到报文后,使用
TCP
协议发送应答报文,这样就开始进行文件的传输了。 这里开启两个线程,线程1负责文件的传送,线程2负责文件的接受,下边做一一说明。 首先,我们知道,可以发送多个文件,这些文件需要建立链表保存信息。 typedef struct file_info { struct file_info *next; //双向链表 struct file_info *forward; char *file; //文件名 int type; //文件类型:文件或者文件夹 int size; //文件大小 struct sockaddr_in addr; //目标网络信息 } FILE_INFO; [1]文件传送链表由专门的线程维护,这样,线程1就可以专心进行处理文件传输队列就可以了,线程1始终查询这个链表,如果表头为NULL,就说明没有要传输的文件,表头非空,就开始发送报文,获得正确的应答后,就可以开始文件的传输了,文件传输结束,将相应的链表节点删除。这里借鉴了很多程序中使用非常广泛的“命名池”相关的概念,只不过这里我们使用的是“文件池”,可以这么认为,如果有文件要传输,可以不用考虑是否有文件正在传输,只要把要传输的文件放入 “文件池”就可以了 , 同时,不用考虑“文件池”的大小,线程1是文件池的服务线程,它检测文件池的大小,如果非空,就会逐次传输文件。 这里需要特别注意的就是关于文件夹的传输,这个FreeEIM(飞鸽传书)一个难点,应为对与文件夹的内容是没有显示的,需要我们逐次的判断,在飞鸽传书中是这么处理的,如果是一个文件夹,就发送文件属性为IPMSG_FILE_DIR的信息包,FreeEIM(飞鸽传书)客户端收到这个信息包后,就创建这个文件夹,然后发起发送的FreeEIM(飞鸽传书)客户端,进入文件夹,传送文件夹内的文件,如果该文件夹下,还有文件夹,使用相同的方法,在文件夹内的文件传送结束后,就发送FREEEIM_FILE_RETPARENT信息包,接受的FREEEI_FILE_RETP报文的FreeEIM(飞鸽传书)客户端,执行返回上一级目录,FreeEIM(飞鸽传书)发送端,就需发送目录下的文件。这样循环操作,最终完成文件的传输,这个过程比较难以理解。 有了上边的知识,开发文件传输功能就变得简单多了,文件的接受也可以类推了,同样开启一个线程维护接受文件链表,逐次接受身下的文件,链表为空时。文件传输会遇到文件读写问题,有的文件发送是被打开了,这样会造成访问违规,所以要有相应的处理,才能让程序更加稳健。 程序启动时先读取用户配置文件,一般是"*.ini"格式,然后,使用Winsock的广播消息给整个局域网发送一个数据包,这时候,如果其他电脑已经运行了飞鸽传书,那么他收到这个包后,会将包的信息读取出来,当然,这个包里有用户的IP,用户名,性别等等。这样,在用户列表里就多了一个用户了。他的用户检查方式就如此简单而已。至于跨网段的实现,只需简单地修改一下广播地址就行了,如果不考虑速度,你可以给整个internet发广播消息。 消息发送,文件传输这些功能,都比较简单,如果你会网络编程,给你对方IP地址,这些功能实现起来再简单不过了。语音、视屏等,只需编写一些语音视频采集代码,传书的话,就像传文件一样。这里给段广播消息的实现代码吧: // 发送广播登陆消息 void EM_UserLogin::SendLogin_BC(LPEM_DATA msg) {
SOCKET
m_
socket
; m_
socket
=
socket
(AF_INET, SOCK_DGRAM, IPPROTO_IP); if (INVALID_
SOCKET
== m_
socket
) { MessageBox(0, "
socket
failed.", NULL, MB_OK); } SOCKADDR_IN sin;sin.sin_addr.s_addr = htonl(INADDR_BROADCAST); sin.sin_family = AF_INET; sin.sin_port = htons(BROADCAST_SEND_PORT);BOOL bOpt = TRUE; if (
SOCKET
_ERROR == setsockopt(m_
socket
, SOL_
SOCKET
, SO_BROADCAST, (char*)&bOpt, sizeof(bOpt))) { // Error occurred ::MessageBox(0,"BC setsockopt error.",0,0); return; } char *tmpBuf = msg->GetBuffer(); if (
SOCKET
_ERROR == sendto(m_
socket
, tmpBuf, msg->GetLength(), 0, (PSOCKADDR)&sin, sizeof(sin))) { // Error occurred ::MessageBox(0,"BC sendto error.",0,0); return; }
close
socket
(m_
socket
); 相关信息 - 所有的设置信息都保存在注册表的以下位置: \\HKEY_CURRENT_USER\Software\HSTools\ 用户密码以不可逆加密方式存储. ******************************************************************* * 如果你忘记了密码, 可以在注册表中将此键值删除 * * \\HKEY_CURRENT_USER\Software\HSTools\IPMsgEng\PasswordStr * ******************************************************************* - 本软件使用的默认端口为 2425 若仅使用 UDP 协议的端口, 将不能传送文件/文件夹 (如果安装了防火墙, 则必须打开相应的
TCP
和 UDP 端口) - 本软件为自由软件, 你可以随意传播, 但源码使用请参见许可协议. - 只有在启动或退出程序, 使用离开模式, 刷新在线用户时 IPMsg 才会进行消息广播. - 本软件由 Microsoft Visual C++ 6.0 编译 广域网设置(广播设置) - 主机号全部为 1 的 IP 地址, 即广播地址 例如, 连接到一个 C 类子网(即 24 位网络号, 8 位主机号), IP 地址为 aaa.bbb.ccc.ddd, 其广播地址即为: aaa.bbb.ccc.255 若对方处于另一个私有子网中, 广播可能无效. - 更多问题, 请参阅相关资料或咨询你的网络管理员. - 若两台主机的连接经过了多个路由器, 请直接指定对方IP地址 - 拨号上网用户请勾选 [拨号连接] 当刷新在线用户列表时, 列表不会被清空 补充 - 启动飞鸽传书前, 你可以指定其运行时使用的端口, 且可以使用不同的端口打开多个窗口. 用法如下: ipmsg.exe 2426 (你可在快捷方式上设置) 但是你只能与同时也使用该端口的用户通信. - 所以你尽可选用你喜欢的端口运行本软件. 介于 10000 至 60000 可能更安全些. 你也可以咨询你的网络管理员. - 如果有多个网卡(IP), 你可以将飞鸽传书与指定的网卡(IP)进行绑定. 命令格式如下(你可以在快捷方式上设置): ipmsg.exe [端口] /NIC IP地址 例如: C:\>ipmsg.exe /NIC 192.168.10.100 - 支持命令方式发送消息 命令格式如下: ipmsg.exe [端口] /MSG [/LOG][/SEAL] <主机名或IP地址> <消息> 例如: C:\>ipmsg.exe /MSG /SEAL localhost Hello. 支持 - IPMsg 的技术讨论区是开放的. 如果你想订阅相关邮件, 请联系 ipmsg-subscribe@ring.gr.jp - 欢迎报告 bug, 以及提出建议 - 如果你有任何
疑问
, 请 E-mail 联系. shirouzu@h.email.ne.jp 中文版可联系阿志: hiwyz@163.net - 发送错误报告, 请勿必记录以下信息: 软件版本, 操作系统, 故障描述, 以及故障重现方法等. 更新历史 ver 1.00 ... 日文版 (1996/08/19) ver 1.31 ... 英文版/日文版 (1997/09/01) ver 2.00 ... 英文版/日文版 (2002/11/19) 支持文件/文件夹传送 支持通信数据加密 ver 2.03 ... Bug 修正 (文件传送引起缓冲溢出) 广播设置支持主机地址(FQDN)解析 ver 2.04 ... 增加绑定网卡(IP)功能 ver 2.05 ... Bug 修正 (2.04版当激活发送/接收消息窗口时,无法注销/关闭系统) ver 2.06 ... 很小的调整 ver 2007 ... 全面调整软件的界面可用性、性能稳定性 注意:本版本为 IPMSG 2.06版 编译环境: WINXP & VS2005, 可正确编译。
关于shutdown 和
close
socket
的彻底理解!
shutdown 和
close
socket
来,咱们彻底的来讨论一下这个shutdown 和
close
socket
从函数调用上来分析(msdn):一旦完成了套接字的连接,应当将套接字关闭,并且释放其套接字句柄所占用的所有资源。真正释放一个已经打开的套接字句柄的资源直接调用
close
socket
即可,但要明白
close
socket
的调用可能会带来负面影响,具体的影响和如何调用有关,最明显...
Socket
和
TCP
的关系
Socket
和
TCP
TCP
与UDP之
Socket
编程
本文主要讲的是如何用
Socket
实现
TCP
和UDP基础上的服务器端和客户端通信。在代码上的通信流程和一些细节以及两者在代码上的区别和原因。 目录 一、
Socket
二、
TCP
方式通信 服务器端 ● 创建欢迎套接字
socket
●创建专属套接字
socket
●读取数据流 ●发送数据流 ●关闭
socket
客户端 ●创建
socket
●发数据流 ●收数据流 ●关闭
socket
三、UDP方式通信 服务器端 ●创建
socket
●接收数据报 ●发送数据...
了解
TCP
与
Socket
文章目录1. 理解
TCP
1.1 了解
TCP
1.2 分层实现1.3 数据传输1.4
TCP
头部解析1.5
TCP
的三次握手、四次挥手1.6
TCP
的11种状态2. 了解
Socket
2.1 什么是
Socket
2.2
Socket
格式3. 完整网络数据传输过程 1. 理解
TCP
1.1 了解
TCP
&amp;amp;amp;nbsp;&amp;amp;amp;nbsp;&amp;amp;amp;nbsp;&amp;amp;amp;nbsp;&a
网络编程
18,356
社区成员
64,214
社区内容
发帖
与我相关
我的任务
网络编程
VC/MFC 网络编程
复制链接
扫一扫
分享
社区描述
VC/MFC 网络编程
c++
c语言
开发语言
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章