⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 socketdlg.cpp

📁 基于UDP编写的网络通讯测试程序
💻 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 + -