紧急求助!关于socket优雅关闭问题?

zhouzhipen 2012-08-21 03:37:34
先看一段代码:

MyHandler(SOCKET hSocket)
{
waitChar(hSocket,'\0x11');
SendFile(hSocket,"C:\\a.dat")
shutdown(hSocket,BOTH);
closesocket(hSocket);
}


下面是相关函数定义

void waitChar(SOCKET hSocket,char ch)
{
int ch1=0;
while(SOCKET_ERROR!=recv(hSocket,&ch1,1,0))
{
if(ch==ch1)
break;
}
}

bool SendFile(SOCKET hSocket,const char* filename)
{
CGFile file;
file.Open(filename,CGFile::F_READ);
::TransmitFile(hSocket,file.GetHandle(),0,0,NULL,NULL,0);
file.Close();
return true;
}


以上代码是客户端处理程序的一个段,当客户端需要数据时,会发送'\0x11'给服务器,服务器收到请求后,发送一个文件给客户端,现在问题是这样的:
服务端在一个处理线程中调用MyHandler,但客户端收到的数据总是不全,但如果文件小一点,就可以全部接收到。后来调试发现服务端提前关闭了SOCKET,也就是说,SendFile完成之后立即关闭了SOCKET。
之前已经有使用相关代把SOCKET设置为“优雅关闭”,优雅关闭SOCKET,系统不是会自动把数据发送完毕吗?
...全文
392 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
杨双龙 2013-03-10
  • 打赏
  • 举报
回复
zhouzhipen 2012-08-28
  • 打赏
  • 举报
回复
问题已解决,仔细查看了相关资料发现,原来SOCKET的“优雅关闭”不只是发送端的事情,如果对端不支持,还是会立即关闭的。这次程序中的对端正是一个单片机设备,应该是对SOCKET协议支持不完全,所以当发送端发出关闭信号时,立即关闭了连接。
zhouzhipen 2012-08-22
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 的回复:]

我以前玩Socket通信,大文件都是自己CFile open出来,而且根据自定义通信协议分段发送,保证每次发送量。楼主是用什么通信的,怎么一大个文件,就能直接发送?这是什么类库啊?
[/Quote]
TransmitFile 在2000系统以上都有这个API,可以直接传送文件。
傻X 2012-08-22
  • 打赏
  • 举报
回复
我以前玩Socket通信,大文件都是自己CFile open出来,而且根据自定义通信协议分段发送,保证每次发送量。楼主是用什么通信的,怎么一大个文件,就能直接发送?这是什么类库啊?
这不是鸭头 2012-08-22
  • 打赏
  • 举报
回复
TransmitFile 这个函数还真是没用过。
fronz 2012-08-21
  • 打赏
  • 举报
回复
mark,
没太注意TransmitFile这个函数

提拉米苏&Eleven都是太熟的面孔了,钦佩
Wentasy 2012-08-21
  • 打赏
  • 举报
回复
优雅关闭,这个问题问得很好。
Eleven 2012-08-21
  • 打赏
  • 举报
回复
有看TransmitFile()函数的返回值是什么吗?
zhouzhipen 2012-08-21
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]

退休贴啊
SendFile(hSocket,"C:\\a.dat")
shutdown(hSocket,BOTH); //为什么发送了就关闭?

你客户端单独开线程接收服务器发来的文件?
如果是就可以(但是等于服务器提前就知道你的地址,客户端变成服务器了)
不是的话,你关闭了,服务器你以发送的socket回复,回复给谁呢?
[/Quote]

这是服务器的代码片段,服务器中的MyHandler是处理函数,服务器把接受的socket交给MyHandler处理。
傻X 2012-08-21
  • 打赏
  • 举报
回复
退休贴啊
SendFile(hSocket,"C:\\a.dat")
shutdown(hSocket,BOTH); //为什么发送了就关闭?

你客户端单独开线程接收服务器发来的文件?
如果是就可以(但是等于服务器提前就知道你的地址,客户端变成服务器了)
不是的话,你关闭了,服务器你以发送的socket回复,回复给谁呢?


oyljerry 2012-08-21
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]
oyljerry都两颗钻石了,咋不申请大版主了,也好让我提前退休
[/Quote]
11不是申请了嘛. ^_^,我时间上抽不出来管理大版。
版大你也别急着退休啊!
Gloveing 2012-08-21
  • 打赏
  • 举报
回复
你怎么发送数据的呢?
成功send结束,并不意味着数据成功的发送到对方了
zhouzhipen 2012-08-21
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

oyljerry都两颗钻石了,咋不申请大版主了,也好让我提前退休
[/Quote]

您都有多久没来CSDN了,自从上次您的一篇自传之后,就很少露面,都想死俺们了。
快乐鹦鹉 2012-08-21
  • 打赏
  • 举报
回复
oyljerry都两颗钻石了,咋不申请大版主了,也好让我提前退休
zhouzhipen 2012-08-21
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

为啥立马关闭呢?不能等客户端收完文件后,给服务端一个关闭信号吗?
[/Quote]
对端是一台机器设备,其中的协议是固化在芯片中,不能由我们来修改协议。
zhouzhipen 2012-08-21
  • 打赏
  • 举报
回复
我也怀疑与这个有关,但MSDN上不是说这个函数可以提高服务器的处理效率嘛,所以就用了。先改改看。先谢过了。
不知道有没有人知道出现这种问题的具体原因?
快乐鹦鹉 2012-08-21
  • 打赏
  • 举报
回复
为啥立马关闭呢?不能等客户端收完文件后,给服务端一个关闭信号吗?
oyljerry 2012-08-21
  • 打赏
  • 举报
回复
不然就不要直接使用API TransmitFile,而是自己来通过TCP等send发送

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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