异步套接字编程问题,为什么在虚拟机中运行程序,不能首先向实体机运行的程序发送消息?
首先声明我是个新手,在学习孙鑫老师的MFC视频网络编程当中,我按视频中讲述的用多线程和采用异步套接字编程分别编写了一个聊天室(chat)程序,编写完成后,测试运行,在本地...
首先声明我是个新手,在学习孙鑫老师的MFC视频网络编程当中,我按视频中讲述的用多线程和采用异步套接字编程分别编写了一个聊天室(chat)程序,编写完成后,测试运行,在本地测试,也就是在IP地址框中输入本地IP 127.0.0.1时,运行没有任何问题,但是我用虚拟机测试时却出现了问题。测试如下:我在实体机和虚拟机分别运行chat程序,在实体机上的程序的IP地址框中填写虚拟机的IP地址,然后向其发送消息,然而在虚拟机上的程序却没能接收到消息,在虚拟机中的接收消息函数中设置断点,发现windows根本没有调用这个函数,然而当我在虚拟机中的程序的IP地址框中输入实体机的IP地址,向其发送消息时,实体机上运行的程序就能收到消息,这时再通过实体机上的程序向虚拟机上的程序发送消息,消息就能被收到了。但是在隔一段时间不退出程序的情况下,先用实体机向虚拟机发送消息,又会出现上述部问题,请问这是为什么呢?
这是接收函数代码:DWORD WINAPI CChatDlg::RecvProc(LPVOID lpParameter){SOCKET sock=((RECVPARAM*)lpParameter)->sock;HWND hwnd=((RECVPARAM*)lpParameter)->hwnd;delete lpParameter; //视频讲述时,遗忘了释放内存的操作。sunxinSOCKADDR_IN addrFrom;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 CChatDlg::OnBtnSend() {// TODO: Add your control notification handler code hereDWORD 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,strSend,strSend.GetLength()+1,0,(SOCKADDR*)&addrTo,sizeof(SOCKADDR));SetDlgItemText(IDC_EDIT_SEND,"");} 展开
这是接收函数代码:DWORD WINAPI CChatDlg::RecvProc(LPVOID lpParameter){SOCKET sock=((RECVPARAM*)lpParameter)->sock;HWND hwnd=((RECVPARAM*)lpParameter)->hwnd;delete lpParameter; //视频讲述时,遗忘了释放内存的操作。sunxinSOCKADDR_IN addrFrom;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 CChatDlg::OnBtnSend() {// TODO: Add your control notification handler code hereDWORD 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,strSend,strSend.GetLength()+1,0,(SOCKADDR*)&addrTo,sizeof(SOCKADDR));SetDlgItemText(IDC_EDIT_SEND,"");} 展开
1个回答
展开全部
你的虚拟机里面有防火墙之类的东西吗?比如windows防火墙,默认是开启的,在防火墙开启的情况下,你想要连接你的6000端口是连不上的
追问
追答
因为这个阻止的是端口不是程序。你看你的防火墙设置有两项,一项是“添加程序”,一项是“添加端口”,如果是不在白名单的程序访问网络,那么会有提示;但是其他机器试图连接不在白名单里面的端口时不会有通知。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询