int length=file.GetLength();
byte* data=new byte[length];
file.Read(data,length);
for(pos=m_SocketList.GetHeadPosition();pos!=NULL;)
{
pSocket=(CClientSocket*)m_SocketList.GetNext(pos);
pSocket->Send(&length,4);//此处的4是什么意思?限定了length的字节数小于4么?
pSocket->Send(data,length);
}
这样只能实现传送文本文件,是不是因为字节数的原因呢?如果要实现传输更大一点的文件,如音乐,该怎么办呢???
byte* data=new byte[length];
file.Read(data,length);
for(pos=m_SocketList.GetHeadPosition();pos!=NULL;)
{
pSocket=(CClientSocket*)m_SocketList.GetNext(pos);
pSocket->Send(&length,4);//此处的4是什么意思?限定了length的字节数小于4么?
pSocket->Send(data,length);
}
这样只能实现传送文本文件,是不是因为字节数的原因呢?如果要实现传输更大一点的文件,如音乐,该怎么办呢???
解决方案 »
- Socket发送文件
- 大家新年好,有个问题提问一下
- W2A转化为char型,如何转化
- 创建或关闭一子窗口,父窗口会收到什么消息吗?
- 为什么我写了一个程式注册windows服务后,MessageBox(0,szMsg,szCaption,0);函数调用失败?
- vHJ=msg.hj; //msg.hj是int, vHJ是ado数据,_variant_t 怎样给vHJ赋值,急!!!
- 一个简单的问题--请指点
- 入门级问题,谁来捡这20分!!!!!!!!!!!
- 请问怎么在MSFlexGrid中直接操作数据库啊?
- VC6.0工具条是否支持256色位图?谢谢!
- 通过一个什么函数可以把一个窗口始终显示在多个窗口的最前面?
- 为什么在WIN2000下编写C++程序时,总出现说内存不能为读的错误!
具体看MSDN吧BYTE buffer[1024];
memset(buffer, 0, sizeof(buffer));
while(true)
{
int nSize = mySocket.Recive(buffer, sizeof(buffer))
if(nSize == SOCKET_ERROR)
{
//出错了
}
else if(nSize < sizeof(buffer))
{
//收完了
}
else
{
//先把buffer里的东西存起来再说
}
}
while循环要在合适的地方break的说
http://www.codeguru.com/network/FileTransferUsingSockets.shtml
socket是流式的,只有连接(起点)和关闭(终点),每次发送的字节数和每次接收的字节数并不一致。所以有必要在发送数据之前先发送一个要发送数据的长度,接收时先读出数据长度,然后接收该长度的数据。
要发送大的文件:
int length=file.GetLength();
BYTE buffer[1024];
for(pos=m_SocketList.GetHeadPosition();pos!=NULL;)
{
pSocket=(CClientSocket*)m_SocketList.GetNext(pos);
pSocket->Send(&length,sizeof(int));
int cbw = 0;
while(cbw < length)
{
int len = sizeof(buffer);
if (len > length-cbw)
len = length-cbw;
len = (int)file.Read(buffer,len);
pSocket->Send(buffer,len);
cbw += len;
}
}
byte* data = new byte[myFileLength];
myFile.Read(data, myFileLength);
sockRecv.Send(data, myFileLength);
以下是MFC封装代码:
int CSocket::Send(const void* lpBuf, int nBufLen, int nFlags)
{
if (m_pbBlocking != NULL)
{
WSASetLastError(WSAEINPROGRESS);
return FALSE;
} int nLeft, nWritten;
PBYTE pBuf = (PBYTE)lpBuf;
nLeft = nBufLen; while (nLeft > 0)
{
nWritten = SendChunk(pBuf, nLeft, nFlags);
if (nWritten == SOCKET_ERROR)
return nWritten; nLeft -= nWritten;
pBuf += nWritten;
}
return nBufLen - nLeft;
}int CSocket::SendChunk(const void* lpBuf, int nBufLen, int nFlags)
{
int nResult;
while ((nResult = CAsyncSocket::Send(lpBuf, nBufLen, nFlags)) == SOCKET_ERROR)
{
if (GetLastError() == WSAEWOULDBLOCK)
{
if (!PumpMessages(FD_WRITE))
return SOCKET_ERROR;
}
else
return SOCKET_ERROR;
}
return nResult;
}
int CAsyncSocket::Send(const void* lpBuf, int nBufLen, int nFlags)
{
return send(m_hSocket, (LPSTR)lpBuf, nBufLen, nFlags);
}
可以看到,CAsyncSocket是直接调用了API send方法,是一层薄得不能再薄的封装,而对于CSocket 则做了更多的处理,只用全部发送出去才会返回。
所以,如果使用CAsyncSocket::send就要使用while循环,但我不赞成使用固定大小buffer发送,而是要使用如上面封装时的算法发送。(更多可以参考《windows网络编程》)
当然,如果文件过大,以至于超过heap所允许的范围,是要分很多次的,但我们至少要搞清楚为什么要分很多次。
http://www.vckbase.com/code/listcode.asp?mclsid=9&sclsid=901
下载地址
http://www.vckbase.com/code/downcode.asp?id=1511