孙鑫视频中的聊天室应用程序代码,不知哪里没写对,在VS中调试出错
运行的结果应该是,在对话框中的编辑框内输入字符串和IP地址,同时在接收框中显示本次和上次的字符串,但是现在,同样的代码,在VS2008中运行出来,每次却只能在接收框中显示第一个字符,请大家多多指教啊~~小弟先行谢过各位大虾了!
核心代码如下:
BOOL CChatDlg::InitSocket(){ m_socket = socket(AF_INET, SOCK_DGRAM, 0); if(INVALID_SOCKET == m_socket) { MessageBoxW(L"套接字创建失败!"); return FALSE; } SOCKADDR_IN addrSock; addrSock.sin_family = AF_INET; addrSock.sin_port = htons(6000); addrSock.sin_addr.S_un.S_addr = htonl(INADDR_ANY); int retval = 0; bind(m_socket, (SOCKADDR*)&addrSock, sizeof(SOCKADDR)); if(SOCKET_ERROR == retval) { closesocket(m_socket); MessageBoxW(L"绑定失败!"); return FALSE; } return TRUE;}DWORD WINAPI CChatDlg::RecvProc(LPVOID lpParameter){ SOCKET sock = ((RECVPARAM*)lpParameter)->sock; HWND hwnd = ((RECVPARAM*)lpParameter)->hwnd; delete lpParameter; SOCKADDR_IN addrFrom; int len = sizeof(SOCKADDR); int retval; char recvBuf[200]; memset(recvBuf,0,200); char tempBuf[300]; memset(tempBuf,0,300); while(TRUE) { //在此处打断点,发现recvBuf中,只接收输入的字符串的前三个或者四个字符, //最后一个字符还是以前的某字符串中的字符 retval = recvfrom(sock, recvBuf, 200, 0, (SOCKADDR*)&addrFrom, &len); if(SOCKET_ERROR == retval) { break; } sprintf_s(tempBuf, 300, "%s说: %s", inet_ntoa(addrFrom.sin_addr), recvBuf); ::PostMessage(hwnd, WM_RECVDATA, 0, (LPARAM)tempBuf); } return 0;}LRESULT CChatDlg::OnRecvData(WPARAM wParam, LPARAM lParam) //将void 改为 LRESULT{ //str.Format(L"%s", lParam); CSDN上有兄弟说用Format()赋值, //但这样的话,接收框里就成了乱码了 CString str((char*)lParam); CString strTemp; GetDlgItemText(IDC_EDIT_RECV, strTemp); str += "\r\n"; str += strTemp; SetDlgItemText(IDC_EDIT_RECV, str); return 0;}void CChatDlg::OnBnClickedBtnSend(){ // TODO: 在此添加控件通知处理程序代码 DWORD dwIP; ((CIPAddressCtrl*)GetDlgItem(IDC_IPADDRESS1))->GetAddress(dwIP); SOCKADDR_IN addrTo; addrTo.sin_family=AF_INET; addrTo.sin_port=htons(6000); addrTo.sin_addr.S_un.S_addr=htonl(dwIP); CString strSend; GetDlgItemText(IDC_EDIT_SEND,strSend); sendto(m_socket,(char*)(LPCTSTR)strSend,(strSend.GetLength()+1), 0,(SOCKADDR*)&addrTo,sizeof(SOCKADDR)); SetDlgItemText(IDC_EDIT_SEND,NULL);}