求助UDP视频传输

puj2003 2014-11-11 02:19:43
客户端代码:
void VideoProcess()
{
sockaddr_in sendVideoClient;
sendVideoClient.sin_family = AF_INET;
sendVideoClient.sin_addr.S_un.S_addr = inet_addr("192.168.192.35");
sendVideoClient.sin_port = htons(atoi("20000"));
int m_len = sizeof(sendVideoClient);

file.Open("e:\\风景.avi",CFile::modeRead);
this->SetShowEditText("开始传输视频!");
char buf[1024];
char *pBuf;
while(TRUE)
{
memset(buf,0,1024);
len = file.Read(buf, 1024);
if(len<=0)
break;
int words = sendto(m_client3, buf, len, 0,(sockaddr*)&sendVideoClient, m_len);
if(SOCKET_ERROR == words)
{
this->SetErrorMessageBox("发送视频数据失败!");
return;
}
}
this->SetShowEditText("视频发送完成!");
UpdateData();
file.Close();
}
服务器端代码:
DWORD WINAPI VideoRecvThread(LPVOID pParam)
{
CFile file;
char recvBuf[VIDEO_LEN] = {0};
CString StrAviFileName = "e:视频\\" + strVideo + ".avi";
//非阻塞设置
int iMode = 1;
ioctlsocket(m_videosocket, FIONBIO, (u_long FAR*)&iMode);

sockaddr_in recvVideoServer;
int len = sizeof(recvVideoServer);

while(TRUE)
{
memset(recvBuf, 0, 1024*sizeof(char));
int buflen = recvfrom(m_videosocket, recvBuf, 1024, 0, (sockaddr*)&recvVideoServer, &len);
if(SOCKET_ERROR == buflen)
{
}
else if(0 == buflen)
{}
else if(0 < buflen)
{
file.Open(StrAviFileName,CFile::modeCreate | CFile::modeWrite | CFile::modeNoTruncate );
file.SeekToEnd();
file.Write(recvBuf,buflen);
file.Close();
}
}
return 0;
}
一个500多M的视频文件,问什么只传输了几百K,我把socket缓冲区扩到10M,貌似也只传输了10M多就结束了。刚接触传输,不明白如何传视频啊,求助
...全文
224 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
puj2003 2014-11-13
  • 打赏
  • 举报
回复
为什么在数据接收一段时间后,会挂在file.SeekToEnd(),提示文件句柄无效~~~不明白啊
danscort2000 2014-11-12
  • 打赏
  • 举报
回复
你先把中文文件名改成英文的,试一下 由于你使用了不可靠传输,因此有可能把里面的关键祯给丢掉,或者数据完全不符合标准,导致重组的avi文件不符合标准 播放器可以使用mplayer进行尝试,mplayer对格式的自动测试要强过vlc,而且对破损文件,也可以通过设置OFFSET来尝试跳过
xian_wwq 2014-11-12
  • 打赏
  • 举报
回复
UDP协议本身就不可靠, 如果在业务层不处理应答 不处理数据顺序包, 发出去的包又比较大,丢包是难免的。 --- 如果没有太多开发经验,为何不选用TCP呢
shenyi0106 2014-11-11
  • 打赏
  • 举报
回复
1. 你贴的代码是在很难看,用代码编辑模式贴出来会有更多的人来帮你找问题的。 2. IP层数据传输的任何过程都可能会丢数据(发送,路由,接收); 在发送端,如果发送过快,在数据没有到达链路层之前就会被协议栈丢掉; 在接收端,同样如果你处理过慢,数据同样会被后来的数据给冲掉。 路由层暂时不在讨论范围。 在理解了上面的理论基础以后,在来看看你的程序,发送端是个循环发送,通常情况下,CPU的能力是远远大于网卡的IO能力的,所以像这种循环发送的情况,大部分数据是发送不出去的,因为网卡IO的原因。 了解了上面的原理和可能原因后,我们来提供解决方案,通常情况下,针对这种情况有两种解决方案: 1. 发送和接收添加ACK机制;即发送一个包,等待ACK包,在继续发送。 2. 分组发送; 发送一组包后,暂停一段时间,在继续发送下一组包。 同时,如果在公网传输数据的话,还应该设计传输协议,已保证乱序和丢包时可以检测到。

18,363

社区成员

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

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