📄 socketdlg.cpp
字号:
// SocketDlg.cpp : implementation file
//
#include "stdafx.h"
#include "Socket.h"
#include "SocketDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CSocketDlg dialog
CSocketDlg::CSocketDlg(CWnd* pParent /*=NULL*/)
: CDialog(CSocketDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CSocketDlg)
m_ip = _T("");
m_iiip = _T("");
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CSocketDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CSocketDlg)
DDX_Text(pDX, IDC_EDIT3, m_ip);
DDX_Text(pDX, IDC_STATIC_IP, m_iiip);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CSocketDlg, CDialog)
//{{AFX_MSG_MAP(CSocketDlg)
ON_BN_CLICKED(IDC_BTN_SEND, OnBtnSend)
ON_BN_CLICKED(IDC_BTN_EXIT, OnBtnExit)
//}}AFX_MSG_MAP
ON_MESSAGE(WM_RECVDATA,OnRecvData)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CSocketDlg message handlers
BOOL CSocketDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
CenterWindow(GetDesktopWindow()); // center to the hpc screen
int nWidth = GetSystemMetrics(SM_CXSCREEN);
int nHeight = GetSystemMetrics(SM_CYSCREEN);
SetWindowPos(NULL,0,0,nWidth,nHeight,SWP_NOZORDER);
// TODO: Add extra initialization here
InitSocket();
RECVPARAM *pRecvParam=new RECVPARAM;
pRecvParam->sock=m_socket;
pRecvParam->hwnd=m_hWnd;
HANDLE hThread=CreateThread(NULL,0,RecvProc,(LPVOID)pRecvParam,0,NULL);
CloseHandle(hThread);
return TRUE; // return TRUE unless you set the focus to a control
}
BOOL CSocketDlg::InitSocket()
{
m_socket=socket(AF_INET,SOCK_DGRAM,0);
if(INVALID_SOCKET==m_socket)
{
MessageBox(_T("套接字创建失败!"));
return FALSE;
}
SOCKADDR_IN addrSock;
addrSock.sin_family=AF_INET;
addrSock.sin_port=htons(7000);
m_iiip = GetLocalIP();
UpdateData(false);
addrSock.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
int retval;
retval=bind(m_socket,(SOCKADDR*)&addrSock,sizeof(SOCKADDR));
if(SOCKET_ERROR==retval)
{
closesocket(m_socket);
MessageBox(_T("绑定失败!"));
return FALSE;
}
return TRUE;
}
DWORD WINAPI CSocketDlg::RecvProc(LPVOID lpParameter)
{
SOCKET sock=((RECVPARAM*)lpParameter)->sock;
HWND hwnd=((RECVPARAM*)lpParameter)->hwnd;
delete lpParameter;
SOCKADDR_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 CSocketDlg::OnBtnSend()
{
UpdateData(TRUE);
char *pmbbuf = NULL;
wchar_t* pszMIP= m_ip.GetBuffer(m_ip.GetLength()+1);
wcstombs( pmbbuf, pszMIP, MB_CUR_MAX );
u_long dwIP = inet_addr(pmbbuf);
SOCKADDR_IN addrTo;
addrTo.sin_family=AF_INET;
addrTo.sin_port=htons(7000);
addrTo.sin_addr.S_un.S_addr=htonl(dwIP);
CString strSend;
GetDlgItemText(IDC_EDIT_SEND,strSend);
wchar_t* strsendd= strSend.GetBuffer(strSend.GetLength()+1);
char *strbuf = new char[strSend.GetLength()+1];
wcstombs( strbuf, strsendd, strSend.GetLength()+1 );
sendto(m_socket,strbuf,strSend.GetLength()+1,0,
(SOCKADDR*)&addrTo,sizeof(SOCKADDR));
SetDlgItemText(IDC_EDIT_SEND,_T(""));
delete[] strbuf;
}
void CSocketDlg::OnRecvData(WPARAM wParam,LPARAM lParam)
{
CString str=(char*)lParam;
CString strTemp;
GetDlgItemText(IDC_EDIT_RECV,strTemp);
str+="\r\n";
str+=strTemp;
SetDlgItemText(IDC_EDIT_RECV,str);
}
CString CSocketDlg::GetLocalIP()
{
HOSTENT *LocalAddress;
char *Buff;
TCHAR *wBuff;
CString strReturn=_T("");
Buff=new char[256];
wBuff=new TCHAR[256];
memset(Buff,'\0',256);
memset(wBuff,TEXT('\0'),256*sizeof(TCHAR));
if(gethostname(Buff,256)==0)
{
mbstowcs(wBuff,Buff,256);
LocalAddress=gethostbyname(Buff);
memset(Buff,'\0',256);
sprintf(Buff,"%d.%d.%d.%d\0",LocalAddress->h_addr_list[0][0] &
0xff,LocalAddress->h_addr_list[0][1] & 0x00ff,LocalAddress->h_addr_list[0][2]
& 0x0000ff,LocalAddress->h_addr_list[0][3] & 0x000000ff);
memset(wBuff,TEXT('\0'),256*sizeof(TCHAR));
mbstowcs(wBuff,Buff,256);
strReturn =wBuff;
}
else
{}
delete[] Buff;
delete[] wBuff;
return strReturn;
}
void CSocketDlg::OnBtnExit()
{
// TODO: Add your control notification handler code here
OnOK();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -