主要代码如下bool C聊天室1Dlg::initSocket(void)
{
m_socket=socket(AF_INET,SOCK_DGRAM,0);
if(INVALID_SOCKET==m_socket)
{
MessageBox(_T("套接字创建失败"));
return false;
}
SOCKADDR_IN addrServer;
addrServer.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addrServer.sin_family=AF_INET;
addrServer.sin_port=htons(6000); int retVal;
retVal=bind(m_socket,(SOCKADDR*)&addrServer,sizeof(SOCKADDR));
if(SOCKET_ERROR==retVal)
{
closesocket(m_socket);
MessageBox(_T("套接字绑定失败"));
return false;
} return true;
}DWORD WINAPI C聊天室1Dlg::RecvProc(LPVOID lpParameter)
{
RECVPARAM *pRecvParam=(RECVPARAM*)lpParameter;
HWND hWnd=pRecvParam->hWnd;
SOCKET sock=pRecvParam->sock;
char recvBuf[200];
char resultBuf[200];
SOCKADDR_IN addrFrom;
int len=sizeof(SOCKADDR_IN);
while(true)
{
int retVal=recvfrom(sock,recvBuf,200,0,(SOCKADDR*)&addrFrom,&len);
if(SOCKET_ERROR==retVal)
{
AfxMessageBox(_T("接受数据错误"));
break;
}
else
{
sprintf(resultBuf,"%s said: %s",inet_ntoa(addrFrom.sin_addr),recvBuf);
::PostMessageW(hWnd,WM_RECVDATA,0,(LPARAM)resultBuf);
}
return 0;
}
} LRESULT C聊天室1Dlg::OnRecvData(WPARAM wParam,LPARAM lParam)
{
CString recvData=(TCHAR*)lParam;
CString temp;
GetDlgItemText(IDC_EDIT1,temp);
temp+="/r/n";
temp+=recvData;
SetDlgItemText(IDC_EDIT1,temp); return 1;
} void C聊天室1Dlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
DWORD dword;
CIPAddressCtrl *pIPAddr=(CIPAddressCtrl*)GetDlgItem(IDC_IPADDRESS1);
pIPAddr->GetAddress(dword); SOCKADDR_IN addrServer;
addrServer.sin_addr.S_un.S_addr=htonl(dword);
addrServer.sin_family=AF_INET;
addrServer.sin_port=htons(6000); CString strSend;
GetDlgItemText(IDC_EDIT1,strSend);
sendto(m_socket,(char*)(LPCTSTR)strSend,_tcslen(strSend)+1,0,(SOCKADDR*)&addrServer,sizeof(SOCKADDR)); SetDlgItemText(IDC_EDIT1,_T(""));//每次在输出后编辑框也不能清空,为什么
}
{
m_socket=socket(AF_INET,SOCK_DGRAM,0);
if(INVALID_SOCKET==m_socket)
{
MessageBox(_T("套接字创建失败"));
return false;
}
SOCKADDR_IN addrServer;
addrServer.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addrServer.sin_family=AF_INET;
addrServer.sin_port=htons(6000); int retVal;
retVal=bind(m_socket,(SOCKADDR*)&addrServer,sizeof(SOCKADDR));
if(SOCKET_ERROR==retVal)
{
closesocket(m_socket);
MessageBox(_T("套接字绑定失败"));
return false;
} return true;
}DWORD WINAPI C聊天室1Dlg::RecvProc(LPVOID lpParameter)
{
RECVPARAM *pRecvParam=(RECVPARAM*)lpParameter;
HWND hWnd=pRecvParam->hWnd;
SOCKET sock=pRecvParam->sock;
char recvBuf[200];
char resultBuf[200];
SOCKADDR_IN addrFrom;
int len=sizeof(SOCKADDR_IN);
while(true)
{
int retVal=recvfrom(sock,recvBuf,200,0,(SOCKADDR*)&addrFrom,&len);
if(SOCKET_ERROR==retVal)
{
AfxMessageBox(_T("接受数据错误"));
break;
}
else
{
sprintf(resultBuf,"%s said: %s",inet_ntoa(addrFrom.sin_addr),recvBuf);
::PostMessageW(hWnd,WM_RECVDATA,0,(LPARAM)resultBuf);
}
return 0;
}
} LRESULT C聊天室1Dlg::OnRecvData(WPARAM wParam,LPARAM lParam)
{
CString recvData=(TCHAR*)lParam;
CString temp;
GetDlgItemText(IDC_EDIT1,temp);
temp+="/r/n";
temp+=recvData;
SetDlgItemText(IDC_EDIT1,temp); return 1;
} void C聊天室1Dlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
DWORD dword;
CIPAddressCtrl *pIPAddr=(CIPAddressCtrl*)GetDlgItem(IDC_IPADDRESS1);
pIPAddr->GetAddress(dword); SOCKADDR_IN addrServer;
addrServer.sin_addr.S_un.S_addr=htonl(dword);
addrServer.sin_family=AF_INET;
addrServer.sin_port=htons(6000); CString strSend;
GetDlgItemText(IDC_EDIT1,strSend);
sendto(m_socket,(char*)(LPCTSTR)strSend,_tcslen(strSend)+1,0,(SOCKADDR*)&addrServer,sizeof(SOCKADDR)); SetDlgItemText(IDC_EDIT1,_T(""));//每次在输出后编辑框也不能清空,为什么
}
解决方案 »
- 下面的代码连续执行为什么出错
- 为什么每发依次数据都要sleep一下?
- 菜鸟提问:想做一个数学题库的界面,用VC的时候该注意什么问题?
- 指针。指针。有谁能帮帮我??解释一下指针的用法。本人初学者。谢了(在线等)
- 关于如何disable基于对话框的工程的系统菜单
- 获得window 版本的问题
- 如何获取指定窗口一点颜色
- IQ大测试
- 如何从COM口里面获取硬件部分数据
- 我想在程序中使用CDONTS.NewMail来发信,#import "D:\WINNT\system32\cdonts.dll" 后怎么引用?
- ctooltipctrl实现在一个在区域内移动时显示tooltip提醒信息!
- 能否在Edit控件里将某几个文字链接到一个word文件
UpdateData(FALSE);//把变量数据传给控件你的发送端使用 CString strSend;
接收端使用 char recvBuf[200];
可能在类型转换的过程中存在问题,导致乱码
{
RECVPARAM *pRecvParam=(RECVPARAM*)lpParameter;
HWND hWnd=pRecvParam->hWnd;
SOCKET sock=pRecvParam->sock;
char recvBuf[200];
TCHAR wrecvBuf[200];
TCHAR resultBuf[200];
SOCKADDR_IN addrFrom;
int len=sizeof(SOCKADDR_IN);
while(true)
{
int retVal=recvfrom(sock,recvBuf,200,0,(SOCKADDR*)&addrFrom,&len);
if(SOCKET_ERROR==retVal)
{
AfxMessageBox(_T("接受数据错误"));
break;
}
else
{
int ncount = MultiByteToWideChar(CP_ACP, 0,recvBuf, -1, NULL, 0);
ncount = MultiByteToWideChar(CP_ACP, 0, recvBuf, -1, wrecvBut,
static_cast<int>(ncount)); sprintf(resultBuf,"%s said: %s",inet_ntoa(addrFrom.sin_addr),recvBuf);
::PostMessageW(hWnd,WM_RECVDATA,0,(LPARAM)resultBuf);
}
return 0;
}
}
{
RECVPARAM *pRecvParam=(RECVPARAM*)lpParameter;
HWND hWnd=pRecvParam->hWnd;
SOCKET sock=pRecvParam->sock;
char recvBuf[200];
TCHAR wrecvBuf[200];
TCHAR resultBuf[200];
SOCKADDR_IN addrFrom;
int len=sizeof(SOCKADDR_IN);
while(true)
{
int retVal=recvfrom(sock,recvBuf,200,0,(SOCKADDR*)&addrFrom,&len);
if(SOCKET_ERROR==retVal)
{
AfxMessageBox(_T("接受数据错误"));
break;
}
else
{
int ncount = MultiByteToWideChar(CP_ACP, 0,recvBuf, -1, NULL, 0);
ncount = MultiByteToWideChar(CP_ACP, 0, recvBuf, -1, wrecvBut,
static_cast<int>(ncount)); wsprintf(resultBuf,L"%s said: %s",inet_ntoa(addrFrom.sin_addr),wrecvBut);
::PostMessageW(hWnd,WM_RECVDATA,0,(LPARAM)resultBuf);
}
return 0;
}
}
在Unicode下%S表示MBCS,%s表示Unicode。
pedit->Clear();UpdateData(FALSE);