18,356
社区成员
发帖
与我相关
我的任务
分享
BOOL CChatDlg::InitSocket(void)
{
m_socket = socket(AF_INET,SOCK_DGRAM,0);
if(INVALID_SOCKET == m_socket)
{
::AfxMessageBox(L"套接字创建失败了");
return FALSE;
}
SOCKADDR_IN addrSock;
addrSock.sin_family = AF_INET;
addrSock.sin_port = htons(5111);
addrSock.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
int retval = bind(m_socket,(SOCKADDR *)&addrSock,sizeof(SOCKADDR));
if(SOCKET_ERROR == retval)
{
::AfxMessageBox(L"套接字绑定失败了");
closesocket(m_socket);
return FALSE;
}
return true;
}
BOOL CChatDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// 将“关于...”菜单项添加到系统菜单中。
// IDM_ABOUTBOX 必须在系统命令范围内。
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标
// TODO: 在此添加额外的初始化代码
InitSocket();
RECVPARAM * pRecvParam = new RECVPARAM();
pRecvParam->hwnd = GetSafeHwnd();
pRecvParam->socket = m_socket;
HANDLE hThread = CreateThread(NULL,0,RecvProc,(LPVOID)pRecvParam,0,NULL);
CloseHandle(hThread);
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
LRESULT CChatDlg::OnRevcData(WPARAM wParam,LPARAM lParam)
{
CString str = (LPSTR)lParam;
//char strTempA[200];
CString strTempW;
this->GetDlgItemTextW(IDC_EDIT_RECV,strTempW);
str += L"\r\n";
str += strTempW;
this->SetDlgItemTextW(IDC_EDIT_RECV,str);
return 1;
}
DWORD CChatDlg::RecvProc(LPVOID lpParameter)
{
SOCKET sock = ((RECVPARAM *)lpParameter)->socket;
HWND hwnd = ((RECVPARAM *)lpParameter)->hwnd;
SOCKADDR_IN addrFrom;
int len = sizeof(SOCKADDR);
char recvBuff[200];
char tempBuff[200];
int retval;
while(TRUE)
{
retval = recvfrom(sock,recvBuff,200,0,(SOCKADDR *)&addrFrom,&len);
if(SOCKET_ERROR == retval)
{
::AfxMessageBox(L"接收信息失败");
break;
}
sprintf(tempBuff,"%s 说 %s",::inet_ntoa(addrFrom.sin_addr),recvBuff);
::PostMessage(hwnd,WM_RECVDATA,0,(LPARAM)tempBuff);
}// while
return 1;
}
void CChatDlg::OnBnClickedBtnSend()
{
// TODO: 在此添加控件通知处理程序代码
DWORD dwIP;
((CIPAddressCtrl *)GetDlgItem(IDC_IPADDRESS))->GetAddress(dwIP);
SOCKADDR_IN addrTo;
addrTo.sin_family = AF_INET;
addrTo.sin_port = htons(5111);
addrTo.sin_addr.S_un.S_addr = htonl(dwIP);//转换为网络字节序
CString strSend;
char strTempA[200];
::memset(strTempA,0,200);
GetDlgItemTextW(IDC_EDIT_SEND,strSend);
::WideCharToMultiByte(CP_ACP,0,strSend,-1,strTempA,strSend.GetLength(),NULL,NULL);
sendto(m_socket,strTempA,strSend.GetLength()+1,0,(SOCKADDR *)&addrTo,sizeof(SOCKADDR));
SetDlgItemTextW(IDC_EDIT_SEND,L"");
}