开发工具:
文件大小: 27kb
下载次数: 0
上传时间: 2008-12-04
详细说明: 用VC 实现语音聊天 UINT Audio_Listen_Thread(LPVOID lParam) { CRecTestDlg *pdlg = (CRecTestDlg*)lParam; CSocket m_Server; DWORD length; if(!m_Server.Create(4002)) AfxMessageBox("Listen Socket create error"+pdlg->GetError(GetLastError()));//不可单个运行,重复产生同一端口显然是错误的 if(!m_Server.Listen()) AfxMessageBox("m_server.Listen ERROR"+pdlg->GetError(GetLastError())); CSocket recSo; if(! m_Server.Accept(recSo)) AfxMessageBox("m_server.Accept() error"+pdlg->GetError(GetLastError())); m_Se rver.Close(); int sendcount=0;//just for test int ret ; while(1) { //开始循环接收声音文件,首先接收文件长度 ret = recSo.Receive(&length,sizeof(DWORD)); if(ret== SOCKET_ERROR ) AfxMessageBox("服务器端接收声音文件长度出错,原因: "+pdlg->GetError(GetLastError())); if(ret!=sizeof(DWORD)) { AfxMessageBox("接收文件头错误,将关闭该线程"); recSo.Close(); return -1; }//接下来开辟length长的内存空间 pdlg->m_AudioDataOut[pdlg->nReceive].lpdata =(PBYTE)realloc (0,length); if (pdlg->m_AudioDataOut[pdlg->nReceive].lpdata == NULL) { MessageBeep (MB_ICONEXCLAMATION) ; AfxMessageBox("erro memory_ReceiveAudio"); pdlg->OnOK(); recSo.Close(); return -1; } else//内存申请成功,可以进行循环检测接受 { DWORD dwReceived = 0,dwret; while(length>dwReceived) { dwret = recSo.Receive((pdlg->m_AudioDataOut[pdlg->nReceive].lpdata+dwReceived),(length-dwReceived)); dwReceived +=dwret; if(dwReceived ==length) { pdlg->m_AudioDataOut[pdlg->nReceive].dwLength = length; break; } } }//本轮声音文件接收完毕 pdlg->nReceive=(pdlg->nReceive+1)%OutBlocks; } recSo.Close(); pdlg->OnOK(); return 0; } UINT Audio_Send_Thread(LPVOID lParam)//专职的声音文件发送线程 { // 端口也是专用的 CRecTestDlg *pdlg = (CRecTestDlg*)lParam; CSocket m_Client; m_Client.Create(); if( m_Client.Connect("127.0.0.1",4002)) { DWORD ret, length; int count=0; while(1)//循环使用指针nSend { length =pdlg->m_AudioDataIn[pdlg->nSend].dwLength; if(length !=0) { //首先发送块的长度 if(((ret = m_Client.Send(&length,sizeof(DWORD)))!=sizeof(DWORD))||(ret==SOCKET_ERROR)) { AfxMessageBox("声音文件头传输错误!"+pdlg->GetError(GetLastError())); pdlg->OnOK(); break; }//其次发送块的内容 ,循环检测发送 DWORD dwSent = 0;//已经发送掉的字节数 while(1)//==============================发送声音文件开始 { ret = m_Client.Send((pdlg->m_AudioDataIn[pdlg->nSend].lpdata+dwSent),(length-dwSent)); if(ret==SOCKET_ERROR)//检错 { AfxMessageBox("声音文件传输错误!"+pdlg->GetError(GetLastError())); pdlg->OnOK(); break; } else //发送未发送完的 { dwSent += ret; if(dwSent ==length) { free(pdlg->m_AudioDataIn[pdlg->nSend].lpdata); pdlg->m_AudioDataIn[pdlg->nSend].dwLength = 0; break; } } } //======================================发送声音文件结束 } pdlg->nSend = (pdlg->nSend +1)% InBlocks; } } else AfxMessageBox("Socket连接失败"+pdlg->GetError(GetLastError())); m_Client.Close(); return 0; } CString CRecTestDlg::GetError(DWORD error) //返回错误信息 { CString strError; switch(error) { case WSANOTINITIALISED: strError="初始化错误"; break; case WSAENOTCONN: strError="对方没有启动"; break; case WSAEWOULDBLOCK : strError="对方已经关闭"; break; case WSAECONNREFUSED: strError="连接的尝试被拒绝"; break; case WSAENOTSOCK: strError="在一个非套接字上尝试了一个操作"; break; case WSAEADDRINUSE: strError="特定的地址已在使用中"; break; case WSAECONNRESET: strError="与主机的连接被关闭"; break; default: strError="一般错误"; } return strError; } ...展开收缩
(系统自动生成,下载前可以参看下载内容)
下载文件列表
相关说明
- 本站资源为会员上传分享交流与学习,如有侵犯您的权益,请联系我们删除.
- 本站是交换下载平台,提供交流渠道,下载内容来自于网络,除下载问题外,其它问题请自行百度。
- 本站已设置防盗链,请勿用迅雷、QQ旋风等多线程下载软件下载资源,下载后用WinRAR最新版进行解压.
- 如果您发现内容无法下载,请稍后再次尝试;或者到消费记录里找到下载记录反馈给我们.
- 下载后发现下载的内容跟说明不相乎,请到消费记录里找到下载记录反馈给我们,经确认后退回积分.
- 如下载前有疑问,可以通过点击"提供者"的名字,查看对方的联系方式,联系对方咨询.