⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 subject_61645.htm

📁 vc
💻 HTM
📖 第 1 页 / 共 2 页
字号:
<p>
序号:61645 发表者:471605 发表日期:2003-11-20 22:04:36
<br>主题:各位高手讨论一下关于用socket传输文件的问题
<br>内容:本人用socket写一个文件传输的程序大体如下<BR> send端:<BR>&nbsp;&nbsp;&nbsp;&nbsp;for(real=1024;real==1024;)<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;real=file.read(buffer,1024);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;server.send(buffer,1024)<BR>}<BR>client端<BR>&nbsp;&nbsp;&nbsp;&nbsp;for(real=1024;real==1024)<BR>&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; real=client.receive(buffer,1024);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; file1.write(buffer,1024);<BR>&nbsp;&nbsp; }<BR>现在的问题是只可以传不太大的文本文件(十几k),大一点的mp3<BR>(几m)文件就发不过去拉 只能发一点点 同时发过去的文件也打不开<BR>想在这里和朋友们谈谈文件传输的问题,希望高手发表意见!<BR><BR>
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
回复者:bswy 回复日期:2003-11-21 09:32:18
<br>内容:send端:<BR>&nbsp;&nbsp;&nbsp;&nbsp;for(real=1024;real==1024;)<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;real=file.read(buffer,1024);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if( real &gt; 0 )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;server.send(buffer,real);<BR>}<BR>client端<BR>&nbsp;&nbsp;&nbsp;&nbsp;for(real=1024;real==1024)<BR>&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; real=client.receive(buffer,1024);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( real &gt; 0 )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; file1.write(buffer,real);<BR>&nbsp;&nbsp; }<BR><BR>这里只是简单的改了,你试试。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:BigJames 回复日期:2003-11-21 09:39:46
<br>内容:Example<BR><BR>// CMyAsyncSocket is derived from CAsyncSocket and defines the <BR>// following variables:<BR>//&nbsp;&nbsp;&nbsp;&nbsp;CString&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_sendBuffer;&nbsp;&nbsp; //for async send<BR>//&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_nBytesSent;<BR>//&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_nBytesBufferSize;<BR><BR>void CMyAsyncSocket ::OnSend(int nErrorCode)<BR>{<BR>&nbsp;&nbsp; while (m_nBytesSent &lt; m_nBytesBufferSize)<BR>&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int dwBytes;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ((dwBytes = Send((LPCTSTR)m_sendBuffer + m_nBytesSent, <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_nBytesBufferSize - m_nBytesSent)) == SOCKET_ERROR)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (GetLastError() == WSAEWOULDBLOCK) break;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TCHAR szError[256];<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wsprintf(szError, &#34;Server Socket failed to send: %d&#34;, <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GetLastError());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Close();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AfxMessageBox (szError);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_nBytesSent += dwBytes;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp; }<BR>&nbsp;&nbsp; if (m_nBytesSent == m_nBytesBufferSize)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_nBytesSent = m_nBytesBufferSize = 0;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_sendBuffer = &#34;&#34;;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp; CAsyncSocket::OnSend(nErrorCode);<BR>}<BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:BigJames 回复日期:2003-11-21 09:44:45
<br>内容:CSocket(CAsyncSocket的子类)的本质是非阻塞的,发送时需要首先判断当前Buffer是否可写,这个工作就由他的OnSend通知你来做。<BR>而且CSocket设计的本意是和CArchive一起工作的,不适合独立使用,最好使用SOCKET或者CAsyncSocket
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:钟贵 回复日期:2003-11-21 10:36:38
<br>内容:谢谢bigjames!<BR><BR><BR><BR>我从一帖子上看到 在使用recevie 函数时 协议先查看系统的发送buffer是否有数据未发 如果有的话 就会等发送完成后再进行receive<BR><BR>请问此说法正确与否??<BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:BigJames 回复日期:2003-11-21 10:51:58
<br>内容:一般来说,不应该是这样的,至少我对Linux系统的认识不是这样的。<BR>我公司也有新员工使用CSocket发文件,出现和你同样的问题,出错的地方,就是当上次发送的东西还没有被对方接收,发送端还是一直用send继续发数据,结果在CSocket内部发生句柄异常,或者就死在里面了。我个人认为这是CSocket实现上的问题。<BR>最简单的方法是用SOCKET替换CSocket,那么你上面的代码几乎不用改,就应该好用了,当然应该使用阻塞方式。<BR>如果使用费阻塞方式,就要麻烦一点了。<BR>或者使用上面的OnSend检测Buffer可用的时机,也可以考虑。<BR><BR>另一种选择,如果你仅仅是为了发文件,参考MSDN,使用CAchive和CSocket配合,很简单。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:钟贵 回复日期:2003-11-22 09:43:13
<br>内容:bigjames 你好!<BR> 我是想做一个文件升级服务器用来学习socket编程<BR>我的想法是客户端连接服务器后 服务器发给客户端文件信息<BR>客户端对比自己的文件信息 然后根据需要请求服务器发送文件<BR>服务器收到请求后发送文件<BR>我用cachive 和 csocket 配合 发送文件信息<BR>但是不会用他们发送文件 
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:钟贵 回复日期:2003-11-22 09:47:43
<br>内容: 阻塞 非阻塞 这对概念 与 同步 和 异步 这对概念在socket<BR>上是否一样? 
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:BigJames 回复日期:2003-11-22 10:12:42
<br>内容:同步和异步似乎不应该用在socket上,当然还要看这对术语的使用上下文<BR>同步和异步,感觉上要用在比阻塞和非阻塞高一级的层次中。<BR>如果你看到某些socket的描述文档使用了同步和异步,贴出来,我在具体分析一下。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:钟贵 回复日期:2003-11-22 21:54:54
<br>内容:再问问&nbsp;&nbsp;CArchive 和 csocket 怎么发文件?<BR> 是不是先用 carchive 与 文件 相连 用于读文件 或写文件<BR>在用carchive&nbsp;&nbsp;与 csocket 相关联 发送和接收文件<BR>另外 他们能不能发送mp3 及任意的文本文件!
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:BigJames 回复日期:2003-11-22 22:23:48
<br>内容:任意文件都行。<BR>具体参见MSDN samples. \Samples\vc\mfc\advanced\chatter or chatsrvr<BR>里面的例子用的是CArichive和CSocket, 还需要CSocketFile配合。<BR><BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:钟贵 回复日期:2003-11-23 18:30:32
<br>内容:看看这个异步:<BR>2.Windows Socket机制分析<BR><BR>  2.1一些基本的Socket系统调用<BR><BR>  主要的系统调用包括:socket()-创建Socket;bind()-将创建的Socket与本地端口绑定;connect()与accept()-建立Socket连接;listen()-服务器监听是否有连接请求;send()-数据的可控缓冲发送;recv()-可控缓冲接收;closesocket()-关闭Socket。<BR><BR>  2.2Windows Socket的启动与终止<BR><BR>  启动函数WSAStartup()建立与Windows Sockets DLL的连接,终止函数WSAClearup()终止使用该DLL,这两个函数必须成对使用。<BR><BR>  2.3异步选择机制<BR><BR>  Windows是一个非抢占式的操作系统,而不采取UNIX的阻塞机制。当一个通信事件产生时,操作系统要根据设置选择是否对该事件加以处理,WSAAsyncSelect()函数就是用来选择系统所要处理的相应事件。当Socket收到设定的网络事件中的一个时,会给程序窗口一个消息,这个消息里会指定产生网络事件的Socket,发生的事件类型和错误码。<BR><BR>  2.4异步数据传输机制<BR><BR>  WSAAsyncSelect()设定了Socket上的须响应通信事件后,每发生一个这样的事件就会产生一个WM_SOCKET消息传给窗口。而在窗口的回调函数中就应该添加相应的数据传输处理代码。<BR><BR>  
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:BigJames 回复日期:2003-11-23 18:48:37
<br>内容:异步选择机制<BR>异步数据传输机制<BR>这表明同步异步算是一种机制<BR>MSDN里面说,WSAAsyncSelect会自动设置socket为非阻塞方式。

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -