接收端接收不到数据的问题

stariver8326 2007-05-20 03:39:14
初学网络编程,所以遇到很多基础的问题 请各位指点。。。
我是用API的函数基于UDP写的最简单的群聊的程序,现在遇到的问题是点击发送后对方手不到数据
我的核心代码是这样的:(客户端和服务器端是在一起写的)

声明的变量:
struct RECVPARAM
{
SOCKET sock;
HWND hwnd;
SOCKADDR_IN* addrSrv;
CDialog* dlg;
};//创建线程时创建的参数

SOCKET m_sockSrv;
SOCKET m_sockClient;
RECVPARAM *m_pRecvParam;
CArray<SOCKADDR_IN*,SOCKADDR_IN*>m_addrFrom;//保存客户端地址

void CMyNewChatUdpDlg::OnBtnConnect() //侦听或连接按钮
{
UpdateData();
if(m_cmbType.GetCurSel()==0)//作为服务器端
{
m_sockSrv=socket(AF_INET,SOCK_DGRAM,0);

SOCKADDR_IN* addrSrv=new SOCKADDR_IN;
addrSrv->sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addrSrv->sin_family=AF_INET;
addrSrv->sin_port=htons(m_iSrvPort);

bind(m_sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));

m_pRecvParam=new RECVPARAM;
m_pRecvParam->sock=m_sockSrv;
m_pRecvParam->hwnd=m_hWnd;
m_pRecvParam->addrSrv=addrSrv;
m_pRecvParam->dlg=this;
HANDLE hThread=CreateThread(NULL,0,RecvProc,(LPVOID)m_pRecvParam,0,NULL);
CloseHandle(hThread);
}
else//作为客户端
{
m_sockClient=socket(AF_INET,SOCK_DGRAM,0);

SOCKADDR_IN *addrSrv=new SOCKADDR_IN;
addrSrv->sin_addr.S_un.S_addr=inet_addr(m_sSrvName);
addrSrv->sin_family=AF_INET;
addrSrv->sin_port=htons(m_iSrvPort);

m_pRecvParam=new RECVPARAM;
m_pRecvParam->sock=m_sockClient;
m_pRecvParam->hwnd=m_hWnd;
m_pRecvParam->addrSrv=addrSrv;
HANDLE hThread=CreateThread(NULL,0,RecvProcClient,(LPVOID)m_pRecvParam,0,NULL);
CloseHandle(hThread);
}
}

DWORD WINAPI CMyNewChatUdpDlg::RecvProc(LPVOID lpParameter)
{
SOCKET sock=((RECVPARAM*)lpParameter)->sock;
HWND hwnd=((RECVPARAM*)lpParameter)->hwnd;
CMyNewChatUdpDlg* dlg=(CMyNewChatUdpDlg*)(((RECVPARAM*)lpParameter)->dlg);
SOCKADDR_IN* addrFrom=new SOCKADDR_IN;
int len=sizeof(SOCKADDR);

char recvBuf[200];
char tempBuf[300];
int retval;
while(TRUE)
{
retval=recvfrom(sock,recvBuf,200,0,(SOCKADDR*)addrFrom,&len);
if(SOCKET_ERROR==retval)
{
::AfxMessageBox(" Reciev data fail!");
}
else
{
dlg->m_addrFrom.Add(addrFrom);
::AfxMessageBox(" Reciev data success!");

}
if(SOCKET_ERROR==retval)
break;
sprintf(tempBuf,"%s说: %s",inet_ntoa(addrFrom->sin_addr),recvBuf);
::PostMessage(hwnd,WM_RECVDATA,0,(LPARAM)tempBuf);
}
return 0;
}

DWORD WINAPI CMyNewChatUdpDlg::RecvProcClient(LPVOID lpParameter)
{
SOCKET sock=((RECVPARAM*)lpParameter)->sock;
HWND hwnd=((RECVPARAM*)lpParameter)->hwnd;
SOCKADDR_IN* addrFrom=((RECVPARAM*)lpParameter)->addrSrv;
delete lpParameter;

int len=sizeof(SOCKADDR);

char recvBuf[200];
char tempBuf[300];
int retval;
while(TRUE)
{
retval=recvfrom(sock,recvBuf,200,0,(SOCKADDR*)addrFrom,&len);
if(SOCKET_ERROR==retval)
break;
sprintf(tempBuf,"%s说: %s",inet_ntoa(addrFrom->sin_addr),recvBuf);
::PostMessage(hwnd,WM_RECVDATA,0,(LPARAM)tempBuf);
}
return 0;
}
void CMyNewChatUdpDlg::OnRecvData(WPARAM wParam,LPARAM lParam)
{
UpdateData();
CString str=(char*)lParam;
CString strTemp;
GetDlgItemText(IDC_EDIT_RECV,strTemp);
str+="\r\n";
str+=strTemp;
SetDlgItemText(IDC_EDIT_RECV,str);
UpdateData(FALSE);
}

void CMyNewChatUdpDlg::OnBtnSend() //发送数据按钮
{
UpdateData();
CString msg;
CString sendTmp;
if(m_cmbType.GetCurSel()==0)
{
GetDlgItemText(IDC_EDIT_MSG,msg);
for(int i=0;i<m_addrFrom.GetSize();i++)
{
sendto(m_sockSrv,msg,msg.GetLength()+1,0,
(SOCKADDR*)&m_addrFrom[i],sizeof(SOCKADDR));
}
}
else
{
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=inet_addr(m_sSrvName);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(m_iSrvPort);
GetDlgItemText(IDC_EDIT_MSG,msg);
int sendval;
sendval=sendto(m_sockClient,msg,msg.GetLength()+1,0,
(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
if(SOCKET_ERROR==sendval)
MessageBox(" send message failed!");
}
SetDlgItemText(IDC_EDIT_MSG,"");
}
...全文
199 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
kkbws 2007-05-22
  • 打赏
  • 举报
回复
大家都很忙,没耐心看,呵呵,你一点一点调试吧。注意端口设置对不对
stariver8326 2007-05-22
  • 打赏
  • 举报
回复
嘻嘻 谢谢回复
stariver8326 2007-05-20
  • 打赏
  • 举报
回复
为什么没有人理我?

18,356

社区成员

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

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