求助:使用 MFC 开发图形界面程序
1.程序为网络应用程序, VC Socket 开发;2. 采用多线程技术;
3. 体现多线程同步;
急求,忘哪位高手帮忙一下
邮箱785813002@
程序代码:#include <afxwin.h>
#include <afxsock.h>
#include "WinSock.h"
#include "stdafx.h"
#include <atlimage.h>
#define IDC_BUTTON1 1000
#define IDC_BUTTON2 1001
#define IDC_BUTTON3 1002
#define IDC_LISTBOX1 1003
#define IDC_LISTBOX2 1004
#define IDC_EDIT1 1005
#define IDC_EDIT2 1006
#define IDC_EDIT3 1007
#define IDC_GROUPBOX1 1008
#define IDC_GROUPBOX2 1009
CMyApp myApp;
SOCKET sock,clisock,msgsock[50];
sockaddr_in serv,cli;
int m_nAddlen,ee;
int FontSize=80;
BOOL DoFlag=FALSE;
int xop,yop;
CStatic label1;
CEdit edit1;
CEdit edit2;
CListBox listbox1;
CListBox listbox2;
char ipaddress[35];
COLORREF color=RGB(0,0,0);
CString str1;
BOOL CMyApp::InitInstance()
{
if (!AfxSocketInit())
{
return FALSE;
}
m_pMainWnd=new CMainWindow;
m_pMainWnd->ShowWindow(m_nCmdShow);
m_pMainWnd->UpdateWindow();
return TRUE;
}
BEGIN_MESSAGE_MAP(CMainWindow,CFrameWnd)
ON_WM_CREATE()
ON_WM_CTLCOLOR()
ON_WM_ERASEBKGND()
ON_WM_MOUSEMOVE()
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_BN_CLICKED(IDC_BUTTON1,OnButtonClicked1)
ON_BN_CLICKED(IDC_BUTTON2,OnButtonClicked2)
ON_BN_CLICKED(IDC_BUTTON3,OnButtonClicked3)
END_MESSAGE_MAP()
CMainWindow::CMainWindow()
{
Create(NULL,_T("WinSock局域网聊天工具"),WS_POPUP,CRect(100,100,606,560));
}
int CMainWindow::OnCreate(LPCREATESTRUCT lpcs)
{
if (CFrameWnd::OnCreate(lpcs)==-1)
return -1;
font.CreatePointFont(80,"MS Sans Serif");
CRect rect;
rect.SetRect(430,330,470,350);
button1.Create(_T("连接"),WS_CHILD | WS_VISIBLE | SS_CENTER | BS_DEFPUSHBUTTON,rect,this,IDC_BUTTON1);
button1.SetFont(&font);
rect.SetRect(415,360,485,380);
button2.Create(_T("断开连接"),WS_CHILD | WS_VISIBLE | SS_CENTER | BS_DEFPUSHBUTTON,rect,this,IDC_BUTTON2);
button2.SetFont(&font);
rect.SetRect(415,390,485,410);
button3.Create(_T("发送信息"),WS_CHILD | WS_VISIBLE | SS_CENTER | BS_DEFPUSHBUTTON,rect,this,IDC_BUTTON3);
button3.SetFont(&font);
rect.SetRect(6,10,320,304);
listbox1.Create(WS_CHILD | WS_VISIBLE | WS_BORDER | WS_HSCROLL | WS_VSCROLL,rect,this,IDC_LISTBOX1);
listbox1.SetFont(&font);
rect.SetRect(340,10,490,304);
listbox2.Create(WS_CHILD | WS_VISIBLE | WS_BORDER | WS_HSCROLL | WS_VSCROLL,rect,this,IDC_LISTBOX2);
listbox2.SetFont(&font);
rect.SetRect(338,0,491,305);
GroupBox1.Create(_T("客户端名称"),WS_CHILD | WS_VISIBLE | BS_GROUPBOX,rect,this,IDC_GROUPBOX1);
GroupBox1.SetFont(&font);
rect.SetRect(5,0,325,305);
GroupBox2.Create(_T("聊天记录窗口"),WS_CHILD | WS_VISIBLE | BS_GROUPBOX,rect,this,IDC_GROUPBOX2);
GroupBox2.SetFont(&font);
rect.SetRect(105,340,190,360);
edit1.Create(WS_CHILD | WS_VISIBLE | WS_BORDER | ES_AUTOHSCROLL,rect,this,IDC_EDIT1);
edit1.SetFont(&font);
edit1.EnableWindow(FALSE);
rect.SetRect(5,310,85,330);
label2.Create("对方IP地址栏:",WS_CHILD | WS_VISIBLE | SS_CENTER,rect,this);
label2.SetFont(&font);
rect.SetRect(5,340,95,360);
label1.Create(NULL,WS_CHILD | WS_VISIBLE | SS_CENTER,rect,this);
label1.SetFont(&font);
rect.SetRect(105,310,190,330);
edit2.Create(WS_CHILD | WS_VISIBLE | WS_BORDER | ES_AUTOHSCROLL,rect,this,IDC_EDIT2);
edit2.SetFont(&font);
rect.SetRect(20,370,400,450);
edit3.Create(WS_CHILD | WS_VISIBLE | WS_BORDER | WS_HSCROLL | WS_VSCROLL | ES_MULTILINE,rect,this,IDC_EDIT3);
edit3.SetFont(&font);
WinSockStart();
}
void CMainWindow::WinSockStart()
{
TRY{
for (int i=0;i<50;i++)
msgsock[i]=NULL;
serv.sin_addr.s_addr=htonl(INADDR_ANY);
serv.sin_family=AF_INET;
serv.sin_port=5000;
m_nAddlen=sizeof(serv);
sock=socket(AF_INET,SOCK_STREAM,0);
if (bind(sock,(sockaddr*)&serv,m_nAddlen)){
MessageBox("绑定错误!");
}else{
label1.SetWindowText("成功启动服务器");
listen(sock,5);
AfxBeginThread(thread,0);
}
}CATCH (CException,e){
}END_CATCH
}
int getcount();
UINT thread(LPVOID wParam)
{
label1.SetWindowText("");
char buff[100];
int s=1,msgcount,loop=1,flag=0;
//CMainWindow *main=(CMainWindow* ) AfxGetApp()->GetMainWnd();
//CMainWindow *main=(CMainWindow* ) AfxGetApp()->m_pMainWnd;
//CMainWindow *main=(CMainWindow*)CWnd::FromHandle((HWND) wParam);
msgcount=getcount();
if (msgcount==-1)
loop=0;
if(loop){
s=1;
msgsock[msgcount]=accept(sock,(sockaddr*)&(serv),&(m_nAddlen));
if (msgsock[msgcount]==INVALID_SOCKET){
label1.SetWindowText("Error accept");
}else{
AfxBeginThread(thread,0);
while (s!=SOCKET_ERROR){
s=recv(msgsock[msgcount],buff,100,0);
if (s!=SOCKET_ERROR){
listbox1.AddString(CString("连入端 ")+ipaddress+CString(" : ")+buff);
}
}
msgsock[msgcount]=NULL;
closesocket(msgsock[msgcount]);
}
}
AfxEndThread(0);
return 0;
}
int getcount()
{
for(int i=0;i<50;i++){
if (msgsock[i]==NULL)
return i;
}
return -1;
}
UINT thread1(LPVOID wParam){
char buff[100];
char array[25][30];
int s=1,addcount=0;
//CMainWindow *main=(CMainWindow* ) AfxGetApp()->GetMainWnd();
//CMainWindow *main=(CMainWindow*)AfxGetMainWnd();
//CMainWindow *main=(CMainWindow*)(CWnd::FromHandle((HWND) wParam));
while(connect(clisock,(sockaddr*)&cli,sizeof(cli))&&ee!=0){
label1.SetWindowText("");
label1.SetWindowText("等待中...");
label1.SetWindowText("");
for (int i=0;i<=65000;i++)
for(int j=0;j<=200;j++);
if (addcount==25)
addcount=0;
cli.sin_addr.s_addr=inet_addr(array[addcount++]);
}
if (ee==1){
edit1.SetWindowText("连接成功!");
}
while (s!=SOCKET_ERROR && ee!=0){
s=recv(clisock,buff,100,0);
if (s!=SOCKET_ERROR && ee!=0){
listbox1.AddString(buff);
}
}
closesocket(clisock);
AfxEndThread(0);
return 0;
}
void CMainWindow::OnButtonClicked1()
{
edit2.GetWindowText(ipaddress,30);
cli.sin_addr.s_addr=inet_addr(ipaddress);
cli.sin_family=AF_INET;
cli.sin_port=5000;
clisock=socket(AF_INET,SOCK_STREAM,0);
ee=1;
edit1.SetWindowText(ipaddress);
listbox2.AddString(ipaddress);
button1.EnableWindow(FALSE);
edit2.EnableWindow(FALSE);
AfxBeginThread(thread1,0);
}
void CMainWindow::OnButtonClicked2()
{
ee=0;
closesocket(clisock);
edit2.EnableWindow(TRUE);
button1.EnableWindow(TRUE);
}
void CMainWindow::OnButtonClicked3()
{
char buff[100];
edit3.GetWindowText(buff,99);
listbox1.AddString(CString("本人端 : ")+inet_ntoa(serv.sin_addr)+CString(" : ")+buff);
send(clisock,buff,100,0);
}
BOOL CMainWindow::PreTranslateMessage(MSG *pMsg)
{
label1.SetWindowText("成功启动服务器");
char buff[100];
edit3.GetWindowText(buff,99);
CString str=buff;
edit2.GetWindowText(ipaddress,30);
str1=ipaddress;
if ((pMsg->wParam==VK_RETURN) && (::GetKeyState(VK_CONTROL)<0)){
if (edit3.GetFocus()==GetDlgItem(IDC_EDIT3)){
if (str1.IsEmpty()){
MessageBox("请输入IP地址!");
edit3.SetWindowTextA("");
}else if (!str.IsEmpty()){
listbox1.AddString(CString("本人端 ")+inet_ntoa(serv.sin_addr)+CString(" : ")+buff);
send(clisock,buff,100,0);
edit3.SetWindowTextA("");
}
}
}else if((pMsg->wParam==0x46) && (::GetKeyState(VK_CONTROL)<0)){
CFontDialog dlg;
if (IDOK==dlg.DoModal()){
font1.Detach();
LOGFONT temp;
dlg.GetCurrentFont(&temp);
font1.CreateFontIndirect(&temp);
color=dlg.GetColor();
listbox1.SetFont(&font1,FALSE);
Invalidate();
}
}else if (pMsg->wParam==VK_ESCAPE){
DestroyWindow();
PostQuitMessage(0);
}else if (pMsg->wParam==VK_RETURN){
if (edit3.GetFocus()==GetDlgItem(IDC_EDIT3)){
if (str1.IsEmpty()){
MessageBox("请输入IP地址!");
edit3.SetWindowTextA("");
}else if (!str.IsEmpty()){
listbox1.AddString(CString("本人端 ")+inet_ntoa(serv.sin_addr)+CString(" : ")+buff);
send(clisock,buff,100,0);
edit3.SetWindowTextA("");
}
}else if (edit2.GetFocus()==GetDlgItem(IDC_EDIT2)){
if (!str1.IsEmpty()){
edit2.GetWindowText(ipaddress,30);
cli.sin_addr.s_addr=inet_addr(ipaddress);
cli.sin_family=AF_INET;
cli.sin_port=5000;
clisock=socket(AF_INET,SOCK_STREAM,0);
ee=1;
edit1.SetWindowText(ipaddress);
listbox2.AddString(ipaddress);
button1.EnableWindow(FALSE);
edit2.EnableWindow(FALSE);
AfxBeginThread(thread1,0);
}else{
MessageBox("请输入IP地址!");
}
}
}else{
return CFrameWnd::PreTranslateMessage(pMsg);
}
}
BOOL CMainWindow::OnEraseBkgnd(CDC *pDC)
{
CRect rect;
GetClientRect(rect);
DoGradientFill(pDC,&rect);
return TRUE;
}
void CMainWindow::DoGradientFill(CDC *pDC,CRect rect)
{
CImage img;
pDC->SetBkMode(TRANSPARENT);
img.Load("21.png");
img.Draw(pDC->m_hDC,0,0);
SetWindowLong(m_hWnd,GWL_EXSTYLE,WS_EX_LAYERED);
SetLayeredWindowAttributes(RGB(255,255,255),0,LWA_COLORKEY);
}
HBRUSH CMainWindow::OnCtlColor(CDC *pDC,CWnd *pWnd,UINT nCtlColor)
{
CDC dc;
CBitmap bitmap;
bitmap.LoadBitmap("IDB_BITMAP2");
dc.CreateCompatibleDC(pDC);
dc.SelectObject(&bitmap);
HBRUSH hbr;
//HBRUSH hbr=CFrameWnd::OnCtlColor (pDC,pWnd,nCtlColor );
if (listbox1.m_hWnd==pWnd->m_hWnd){
pDC->SetTextColor(color);
pDC->SetBkMode(TRANSPARENT);
hbr=::CreateSolidBrush(RGB(23,234,123));
return (HBRUSH)::GetStockObject(HOLLOW_BRUSH);
}else if (listbox2.m_hWnd==pWnd->m_hWnd){
pDC->SetTextColor(RGB(0,0,0));
pDC->SetBkMode(TRANSPARENT);
hbr=::CreateSolidBrush(RGB(23,34,123));
return (HBRUSH)::GetStockObject(HOLLOW_BRUSH);
}else if (edit1.m_hWnd==pWnd->m_hWnd){
hbr=::CreateSolidBrush(RGB(23,234,123));
return hbr;
}else if (edit2.m_hWnd==pWnd->m_hWnd){
hbr=::CreateSolidBrush(RGB(23,234,123));
return hbr;
}else if (edit3.m_hWnd==pWnd->m_hWnd){
pDC->SetTextColor(RGB(0,0,0));
pDC->SetBkMode(TRANSPARENT);
pDC->BitBlt(0,0,365,65,&dc,0,0,SRCCOPY);
return (HBRUSH)::GetStockObject(HOLLOW_BRUSH);
}else if (label1.m_hWnd==pWnd->m_hWnd){
pDC->SetTextColor(RGB(0,0,0));
pDC->SetBkMode(TRANSPARENT);
return (HBRUSH)::GetStockObject(HOLLOW_BRUSH);
}else if (label2.m_hWnd==pWnd->m_hWnd){
pDC->SetTextColor(RGB(0,0,0));
pDC->SetBkMode(TRANSPARENT);
return (HBRUSH)::GetStockObject(HOLLOW_BRUSH);
}
return hbr;
}
void CMainWindow::PostNcDestroy()
{
delete this;
}
void CMainWindow::OnLButtonDown(UINT nFlags,CPoint point)
{
DoFlag=TRUE;
xop=point.x;
yop=point.y;
}
void CMainWindow::OnLButtonUp(UINT nFlags, CPoint point)
{
DoFlag=FALSE;
}
void CMainWindow::OnMouseMove(UINT nFlags, CPoint point)
{
if (DoFlag){
CRect rect;
::GetWindowRect(m_hWnd,rect);
::SetWindowPos(m_hWnd,NULL,rect.left+point.x-xop,rect.top+point.y-yop,rect.Width(),rect.Height(),SWP_NOSIZE);
}
}
程序代码:#include "Main.h"
CMyApp myApp;
/*************************************************/
/**作 者: 丁 屹 */
/**日 期: 2010.4.28 */
/**函数参数: 无参数 */
/**函数功能: 初始化窗体 */
/**函数返回值: 无返回值 */
/*************************************************/
BOOL CMyApp::InitInstance()
{
m_pMainWnd = new CMainWindow;
m_pMainWnd->ShowWindow(m_nCmdShow);
m_pMainWnd->UpdateWindow();
return TRUE;
}
BEGIN_MESSAGE_MAP(CMainWindow,CFrameWnd)
ON_WM_CREATE()
ON_BN_CLICKED(IDC_BUTTON1,OnButtonClicked1)
ON_NOTIFY(TVN_SELCHANGED, IDC_TREEVIEW, OnSelchangedTrdisktree)
END_MESSAGE_MAP()
/*************************************************/
/**作 者: 丁 屹 */
/**日 期: 2010.4.28 */
/**函数参数: 无参数 */
/**函数功能: 创建UDP连接 */
/**函数返回值: 无返回值 */
/*************************************************/
void CMainWindow::CreateUDP()
{
ListenSocket = INVALID_SOCKET;
WORD VersionRequested = MAKEWORD(1,1);
WSADATA wsaData;
WSAStartup(VersionRequested, &wsaData);
if (wsaData.wVersion !=VersionRequested)
{
TextBox2.SetWindowText("Wrong version or WinSock not loaded\n");
fflush(0);
return;
}
ListenSocket = socket(PF_INET, SOCK_DGRAM, 0);
if (ListenSocket == INVALID_SOCKET)
{
TextBox2.SetWindowText("Error: socket创建失败\n");
fflush(0);
return;
}
char szHostName[128];
hostent *hostdata;
gethostname(szHostName,128);
hostdata = gethostbyname(szHostName);
srv.sin_family = PF_INET;
srv.sin_addr.s_addr = htonl(INADDR_ANY);
srv.sin_port = htons(5000);
ListBox1.AddString(CString("【在线】") + inet_ntoa(*(struct in_addr *)hostdata->h_addr_list[0]));
if (bind(ListenSocket,(struct sockaddr *)&srv,sizeof(srv)) != 0)
{
TextBox2.SetWindowText("Error: 绑定失败\n");
fflush(0);
closesocket(ListenSocket);
return;
}
FileReader("IPList.tmp");
AfxBeginThread(RecvThread,inet_ntoa(*(struct in_addr *)hostdata->h_addr_list[0]));
AfxBeginThread(SendMe,NULL);
}
/*************************************************/
/**作 者: 丁 屹 */
/**日 期: 2010.5.12 */
/**函数功能: 发送自己IP地址 */
/**函数返回值: 无返回值 */
/*************************************************/
UINT SendMe(LPVOID wParam)
{
CString Ipa2;
CString Ipa;
CString Ipa1;
for (int i = 1; i<ListBox1.GetCount(); i++)
{
ListBox1.GetText(i,Ipa2);
//Ipa1 = Ipa1 + Ipa2 + CString("\r\n");
//TextBox1.SetWindowText(Ipa1);
dest.sin_family = PF_INET;
dest.sin_addr.s_addr=inet_addr(Ipa2.Mid(8));
dest.sin_port = htons(5000);
ListBox1.GetText(1,Ipa);
Sent = sendto(ListenSocket, CString("@") + Ipa.Mid(8) , Ipa.Mid(8).GetLength() + 1, 0, (sockaddr *)&dest, sizeof(sockaddr_in));
}
AfxEndThread(0);
return 0;
}
/*************************************************/
/**作 者: 丁 屹 */
/**日 期: 2010.5.12 */
/**函数功能: 发送本人所有好友的IP地址 */
/**函数返回值: 无返回值 */
/*************************************************/
UINT SendAll(LPVOID wParam)
{
CString Ipa2;
CString Msg;
for (int i = 1; i<ListBox1.GetCount(); i++)
{
ListBox1.GetText(i,Ipa2);
dest.sin_family = PF_INET;
dest.sin_addr.s_addr=inet_addr(Ipa2.Mid(8));
dest.sin_port = htons(5000);
for (int j = 1; j<ListBox1.GetCount(); j++)
{
ListBox1.GetText(j,Msg);
Sent = sendto(ListenSocket, CString("%") + Msg.Mid(8), Msg.Mid(8).GetLength() + 1, 0, (sockaddr *)&dest, sizeof(sockaddr_in));
}
}
AfxEndThread(0);
return 0;
}
/*************************************************/
/**作 者: 丁 屹 */
/**日 期: 2010.4.28 */
/**函数参数: 无参数 */
/**函数功能: 创建窗体 */
/**函数返回值: 无返回值 */
/*************************************************/
CMainWindow::CMainWindow()
{
Create(NULL,_T("UDP网络功能函数"),WS_OVERLAPPEDWINDOW,CRect(50,50,700,600));
}
/*************************************************/
/**作 者: 丁 屹 */
/**日 期: 2010.4.28 */
/**函数参数: LPCREATESTRUCT窗体创建结构体 */
/**函数功能: 初始化窗体控件 */
/**函数返回值: 返回值为创建成功与否 */
/*************************************************/
int CMainWindow::OnCreate(LPCREATESTRUCT lpcs)
{
if (CFrameWnd::OnCreate(lpcs) == -1)
return -1;
font.CreatePointFont(100,_T("楷体_GB2312"));
TextBox1.Create(WS_VISIBLE | WS_CHILD | WS_BORDER | WS_VSCROLL | ES_MULTILINE,CRect(10,380,430,460),this,IDC_TEXTBOX1);
TextBox1.SetFont(&font);
TextBox2.Create(WS_VISIBLE | WS_CHILD | WS_BORDER | WS_VSCROLL | ES_MULTILINE,CRect(10,10,210,370),this,IDC_TEXTBOX2);
TextBox2.SetFont(&font);
TextBox2.EnableWindow(FALSE);
TextBox3.Create(WS_VISIBLE | WS_CHILD | WS_BORDER,CRect(90,470,190,490),this,IDC_TEXTBOX3);
TextBox3.SetFont(&font);
Button1.Create(_T("发送"),WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,CRect(10,470,80,490),this,IDC_BUTTON1);
Button1.SetFont(&font);
ListBox1.Create(WS_VISIBLE | WS_CHILD | WS_BORDER,CRect(230,10,430,370),this,IDC_LISTBOX1);
ListBox1.SetFont(&font);
ListBox1.AddString("【群聊】");
TreeView.Create(WS_CHILD | WS_VISIBLE | WS_BORDER | TVS_HASLINES | TVS_LINESATROOT,CRect(450,10,630,480),this,IDC_TREEVIEW);
ImageList.Create(28,28,ILC_COLOR32 | ILC_MASK,0,0);
TreeView.SetImageList(&ImageList,TVSIL_NORMAL);
CreateUDP();
return 0;
}
/***************************************************/
/**作 者: 丁 屹 */
/**日 期: 2010.5.1 */
/**函数功能: 获得IP地址列表 */
/**函数参数: 文件名字 */
/**函数返回值: 无返回值 */
/***************************************************/
void FileReader(CString FileName)
{
CString IPName;
CFileFind fd;
if (fd.FindFile(FileName) == TRUE)
{
CStdioFile file(FileName,CFile::modeRead);
while (file.ReadString(IPName))
{
ListBox1.AddString(CString("【离线】") + IPName);
}
}
}
/*************************************************/
/**作 者: 丁 屹 */
/**日 期: 2010.4.28 */
/**函数功能: 按键点击事件 */
/**函数返回值: 无返回值 */
/*************************************************/
void CMainWindow::OnButtonClicked1()
{
CString Ipa1;
CString Msg;
CString Ipa2;
TextBox1.GetWindowText(Msg);
//群聊跟能模块
if (ListBox1.GetCurSel() == 0)
{
for (int i = 1; i<ListBox1.GetCount(); i++)
{
int Len;
ListBox1.GetText(i,Ipa2);
dest.sin_family = PF_INET;
//dest.sin_addr = *(in_addr *)(hostdata->h_addr_list[0]);
dest.sin_addr.s_addr=inet_addr(Ipa2.Mid(8));
dest.sin_port = htons(5000);
//TextBox1.SetWindowText("信息已经被发送到主机 %s 端口为 %i\n",inet_ntoa(dest.sin_addr), ntohs(dest.sin_port));
Len = strlen(Msg);
Sent = sendto(ListenSocket, Msg, Msg.GetLength(), 0, (sockaddr *)&dest, sizeof(sockaddr_in));
}
}
//私聊功能模块
else
{
int Len;
ListBox1.GetText(ListBox1.GetCurSel(),Ipa1);
dest.sin_family = PF_INET;
//dest.sin_addr = *(in_addr *)(hostdata->h_addr_list[0]);
dest.sin_addr.s_addr=inet_addr(Ipa1.Mid(8));
dest.sin_port = htons(5000);
//TextBox1.SetWindowText("信息已经被发送到主机 %s 端口为 %i\n",inet_ntoa(dest.sin_addr), ntohs(dest.sin_port));
Len = strlen(Msg);
Sent = sendto(ListenSocket, Msg, Msg.GetLength(), 0, (sockaddr *)&dest, sizeof(sockaddr_in));
}
}
/*************************************************/
/**作 者: 丁 屹 */
/**日 期: 2010.4.28 */
/**函数功能: 接受文件线程 */
/**函数返回值: 返回线程 */
/*************************************************/
UINT RecvThread(LPVOID wParam)
{
char buf[4096];
int len = sizeof(client);
CString buff="";
while(TRUE)
{
int result = recvfrom(ListenSocket, buf, sizeof(buf)-1, 0,(sockaddr*)&client, (socklen_t *)&len);
for (int j = 1 ;j<ListBox1.GetCount(); j++)
{
if(ListBox1.FindString(j,CString("【在线】") + inet_ntoa(client.sin_addr)) == LB_ERR)
{
FileWriter(inet_ntoa(client.sin_addr));
ReConnect(inet_ntoa(client.sin_addr));
break;
}
}
buf[result]=0;
if (result > 0)
{
//获取根目录
if (buf[0] == '&')
{
Index1 = ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON1));
root = TreeView.InsertItem(CString(buf).Mid(1),0,0);
}
//获取子目录名
else if (buf[0] == '#')
{
Index1 = ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON1));
TreeView.InsertItem(CString(buf).Mid(1),Index1,Index1,root);
}
//获取文件名
else if (buf[0] == '$')
{
Index2 = ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON2));
TreeView.InsertItem(CString(buf).Mid(1),Index2,Index2,root);
}
//点击事件
else if (buf[0] == '*')
{
strcat(buf ,"\\*.*");
AfxBeginThread(SendDir,(char *)buf + 1);
}
//发送自己的IP地址
else if (buf[0] == '@')
{
CString UserName;
for (int j = 1 ;j<ListBox1.GetCount(); j++)
{
if(ListBox1.FindString(j,CString("【在线】") + inet_ntoa(client.sin_addr)) == LB_ERR)
{
ListBox1.AddString(CString("【在线】") + CString(buf).Mid(1));
Sent = sendto(ListenSocket, CString("@") + (char*)wParam, strlen((char*)wParam) + 1, 0, (sockaddr *)&dest, sizeof(sockaddr_in));
}
ListBox1.GetText(j,UserName);
if (UserName.Mid(8) == CString(buf).Mid(1) && UserName.Left(8) == CString("【离线】"))
{
ListBox1.DeleteString(j);
break;
}
}
//Sent = sendto(ListenSocket, CString("@") + (char*)wParam, strlen((char*)wParam) + 1, 0, (sockaddr *)&dest, sizeof(sockaddr_in));
}
//接受消息
else
{
buff = buff + CString(buf) + "\r\n";
//TextBox2.SetWindowText(CString("Message received from host") +inet_ntoa(client.sin_addr) + CString("port") + ntohs(client.sin_port) + CString("\r\n"));
TextBox2.SetWindowText(buff);
}
}
//TreeView.Invalidate();
}
AfxEndThread(0);
return 0;
}
/***************************************************/
/**作 者: 丁 屹 */
/**日 期: 2010.5.1 */
/**函数功能: 记录对方IP地址 */
/**函数参数: 对方的IP */
/**函数返回值: 无返回值 */
/***************************************************/
void FileWriter(CString IPName)
{
CFile file;
file.Open("IPList.tmp",CFile::modeCreate | CFile::modeWrite);
file.Write(IPName + "\r\n",IPName.GetLength() + 2);
}
/***************************************************/
/**作 者: 丁 屹 */
/**日 期: 2010.5.1 */
/**函数功能: 发送目录列表 */
/**函数返回值: 无返回值 */
/***************************************************/
UINT SendDir(LPVOID wParam)
{
if ((char*)wParam ==NULL)
{
//遍历该系统中的所有盘符
DWORD dw=GetLogicalDrives();
DWORD mask=1;
HTREEITEM root[1000];
for(int i=0;i<sizeof(DWORD)*8;i++){
if(dw&mask){
//遍历每个盘符下的文件
Sent = sendto(ListenSocket, CString("&") + CString(char('A'+i)), + CString(char('A'+i)).GetLength() + 1 , 0, (sockaddr *)&dest, sizeof(sockaddr_in));
FindDir(char('A'+i) + CString(":\\*.*"));
}
mask<<=1;
}
}
else
{
FindDir((char*)wParam);
}
AfxEndThread(0);
return 0;
}
/***************************************************/
/**作 者: 丁 屹 */
/**日 期: 2010.5.1 */
/**函数功能: 文件遍历函数 */
/**函数参数: 目录路径 */
/**函数返回值: 无返回值 */
/***************************************************/
void FindDir(CString Name)
{
CFileFind file;
CFileFind files;
CString str;
BOOL bf1 = file.FindFile(Name);
while (bf1)
{
bf1 = file.FindNextFile();
if (!file.IsDots() && !file.IsDirectory())
{
Sent = sendto(ListenSocket, CString("$") + file.GetFilePath(), file.GetFilePath().GetLength() + 1 , 0, (sockaddr *)&dest, sizeof(sockaddr_in));
}
}
BOOL bf2 = files.FindFile(Name);
while (bf2)
{
bf2 = files.FindNextFile();
if (files.IsDirectory() && !files.IsDots())
{
Sent = sendto(ListenSocket,CString("#") + files.GetFilePath(), files.GetFilePath().GetLength() + 1, 0, (sockaddr *)&dest, sizeof(sockaddr_in));
}
}
}
/***************************************************/
/**作 者: 丁 屹 */
/**日 期: 2010.5.3 */
/**函数功能: 树形列表点击事件 */
/**函数参数: 目录路径 */
/**函数返回值: 无返回值 */
/***************************************************/
void CMainWindow::OnSelchangedTrdisktree(NMHDR* pNMHDR, LRESULT* pResult)
{
root = TreeView.GetSelectedItem();
Sent = sendto(ListenSocket,CString("*") + TreeView.GetItemText(root) , TreeView.GetItemText(root).GetLength() + 1, 0, (sockaddr *)&dest, sizeof(sockaddr_in));
}
BEGIN_MESSAGE_MAP(TextBox,CEdit)
ON_WM_KEYDOWN()
END_MESSAGE_MAP()
/*************************************************/
/**作 者: 丁 屹 */
/**日 期: 2010.4.28 */
/**函数功能: 按键点击事件 */
/**函数返回值: 无返回值 */
/*************************************************/
void TextBox::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
CString Ipa;
if (nChar == VK_RETURN)
{
GetWindowText(Ipa);
hostent *hostdata;
u_long ip = inet_addr(Ipa);
hostdata = gethostbyaddr((char *)&ip, sizeof(ip),PF_INET);
dest.sin_family = PF_INET;
//dest.sin_addr = *(in_addr *)(hostdata->h_addr_list[0]);
dest.sin_addr.s_addr = inet_addr(Ipa);
dest.sin_port = htons(5000);
//ListBox1.AddString(Ipa);
TextBox2.SetWindowText(CString("与") + Ipa + CString("连接成功") + CString("\r\n"));
EnableWindow(FALSE);
AfxBeginThread(SendDir,NULL);
}
}
/***************************************************/
/**作 者: 丁 屹 */
/**日 期: 2010.5.10 */
/**函数功能: 返回连接事件 */
/**函数参数: 对方IP地址 */
/**函数返回值: 无返回值 */
/***************************************************/
void ReConnect(CString Ipa)
{
int i = 1;
hostent *hostdata;
u_long ip = inet_addr(Ipa);
hostdata = gethostbyaddr((char *)&ip, sizeof(ip),PF_INET);
dest.sin_family = PF_INET;
//dest.sin_addr = *(in_addr *)(hostdata->h_addr_list[0]);
dest.sin_addr.s_addr=inet_addr(Ipa);
dest.sin_port = htons(5000);
i++;
ListBox1.AddString(CString("【在线】") + Ipa);
//ListBox1.AddString(inet_ntoa(*(struct in_addr *)hostdata->h_addr_list[0]));
TextBox2.SetWindowText(CString("与") + Ipa + CString("连接成功") + CString("\r\n"));
TextBox3.SetWindowText(Ipa);
TextBox3.EnableWindow(FALSE);
AfxBeginThread(SendDir,NULL);
}
程序代码:#include "Main.h"
CMyApp myApp;
CListBox ListBox1;
CListBox ListBox2;
sockaddr_in serv,cli,fserv,fcli;
SOCKET sock1=NULL,sock2=NULL,msock1,msock2,sock3=NULL,sock4=NULL;
CString SourceFileName;
CString DestFileName;
CFile sourceFile;
CEdit TextBox1;
CFile destFile;
BYTE *buff1;
BYTE *buff2;
BOOL flag=FALSE;
CString strIP;
int count=0;
int scount=0;
int ConnectNum=0;
CButton Button1;
BOOL CMyApp::InitInstance()
{
m_pMainWnd=new CMainWindow;
m_pMainWnd->ShowWindow(m_nCmdShow);
m_pMainWnd->UpdateWindow();
return TRUE;
}
BEGIN_MESSAGE_MAP(CMainWindow,CFrameWnd)
ON_WM_CREATE()
ON_WM_ERASEBKGND()
ON_WM_CTLCOLOR()
ON_WM_NCHITTEST()
ON_BN_CLICKED(IDC_BUTTON1,OnButtonClicked1)
ON_BN_CLICKED(IDC_BUTTON2,OnButtonClicked2)
ON_BN_CLICKED(IDC_BUTTON3,OnButtonClicked3)
END_MESSAGE_MAP()
CMainWindow::CMainWindow()
{
if (!AfxSocketInit())
MessageBox("套接字初始失败");
Create(NULL,_T("超级终端"),WS_POPUPWINDOW,CRect((20*GetSystemMetrics(SM_CXSCREEN))/1280,(20*GetSystemMetrics(SM_CYSCREEN))/960,(960*GetSystemMetrics(SM_CXSCREEN))/1280,(900*GetSystemMetrics(SM_CYSCREEN))/960));
}
int CMainWindow::OnCreate(LPCREATESTRUCT lpcs)
{
if (CFrameWnd::OnCreate(lpcs)==-1)
return -1;
int nFullWidth=GetSystemMetrics(SM_CXSCREEN);
int nFullHeight=GetSystemMetrics(SM_CYSCREEN);
HRGN hRgn=::CreateRoundRectRgn((10*nFullWidth)/1280,(10*nFullHeight)/960,(930*nFullWidth)/1280,(870*nFullHeight)/960,30,30);
SetWindowRgn(hRgn,TRUE);
font.CreatePointFont(100,"楷书_GB2312");
Button1.Create(_T("连接"),WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,CRect((50*nFullWidth)/1280,(800*nFullHeight)/960,(100*nFullWidth)/1280,(825*nFullHeight)/960),this,IDC_BUTTON1);
Button1.SetFont(&font);
Button2.Create(_T("发送"),WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,CRect((105*nFullWidth)/1280,(800*nFullHeight)/960,(155*nFullWidth)/1280,(825*nFullHeight)/960),this,IDC_BUTTON2);
Button2.SetFont(&font);
Button3.Create(_T("发送文件"),WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,CRect((160*nFullWidth)/1280,(800*nFullHeight)/960,(220*nFullWidth)/1280,(825*nFullHeight)/960),this,IDC_BUTTON3);
Button3.SetFont(&font);
ListBox1.Create(WS_VISIBLE | WS_CHILD | WS_VSCROLL | WS_BORDER,CRect((300*nFullWidth)/1280,(30*nFullHeight)/960,(880*nFullWidth)/1280,(610*nFullHeight)/960),this,IDC_LISTBOX1);
ListBox1.SetFont(&font);
ListBox2.Create(WS_VISIBLE | WS_CHILD | WS_VSCROLL | WS_BORDER,CRect((50*nFullWidth)/1280,(30*nFullHeight)/960,(290*nFullWidth)/1280,(610*nFullHeight)/960),this,IDC_LISTBOX2);
ListBox2.SetFont(&font);
TextBox1.Create(WS_CHILD | WS_VISIBLE | WS_BORDER,CRect((150*nFullWidth)/1280,(615*nFullHeight)/960,(280*nFullWidth)/1280,(640*nFullHeight)/960),this,IDC_TEXTBOX1);
TextBox1.SetFont(&font);
TextBox2.Create(WS_CHILD | WS_VISIBLE | ES_AUTOVSCROLL | ES_MULTILINE | WS_BORDER,CRect((50*nFullWidth)/1280,(650*nFullHeight)/960,(880*nFullWidth)/1280,(790*nFullHeight)/960),this,IDC_TEXTBOX2);
TextBox2.SetFont(&font);
Label1.Create(_T("IP地址输入框:"),WS_VISIBLE | WS_CHILD,CRect((50*nFullWidth)/1280,(620*nFullHeight)/960,(145*nFullWidth)/1280,(645*nFullHeight)/960),this,IDC_LABEL1);
Label1.SetFont(&font);
CreateFileSocket();
CreateSocket();
GetHostIP();
//FindFile();
return 0;
}
void CMainWindow::GetHostIP()
{
char szHostName[128];
if (gethostname(szHostName,128)==0)
{
hostent *pHost;
pHost=gethostbyname(szHostName);
strIP=inet_ntoa(*(in_addr*)pHost->h_addr_list[0]);
ListBox2.AddString(CString("本机IP:")+strIP);
}
}
void CMainWindow::FindFile()
{
CFileFind file;
BOOL bf=file.FindFile("C:\\record.log");
if (bf)
{
char buff[4096]="";
CFile file1;
file1.Open("C:\\record.log",CFile::modeRead);
file1.Read(buff,4096);
CString buffsize1=CString(buff).Left(CString(buff).Find('#'));
SourceFileName=buffsize1;
CString buffsize2=CString(buff).Right(CString(buff).GetLength()-CString(buff).ReverseFind('#')-1);
CString buffsize3=CString(buff).Mid(CString(buff).Find('#')+1);
buffsize3=buffsize3.Left(buffsize3.Find('#'));
scount=atoi(buffsize3);
count=atoi(buffsize2);
AutoConnect1();
AutoConnect2();
}
else
{
MessageBox("没有文件");
}
}
void CMainWindow::AutoConnect1()
{
sock2=socket(AF_INET,SOCK_STREAM,IPPROTO_IP);
cli.sin_addr.s_addr=inet_addr("192.168.1.101");
cli.sin_family=AF_INET;
cli.sin_port=5000;
AfxBeginThread(&Thread2,0);
}
void CMainWindow::AutoConnect2()
{
sock3=socket(AF_INET,SOCK_STREAM,IPPROTO_IP);
fcli.sin_addr.s_addr=inet_addr("192.168.1.101");
fcli.sin_family=AF_INET;
fcli.sin_port=8005;
AfxBeginThread(&Thread3,0);
}
void AutoConnect(CString ip)
{
sock3=socket(AF_INET,SOCK_STREAM,IPPROTO_IP);
fcli.sin_addr.s_addr=inet_addr(ip);
fcli.sin_family=AF_INET;
fcli.sin_port=8005;
AfxBeginThread(&Thread2,0);
}
BOOL CMainWindow::OnEraseBkgnd(CDC *pDC)
{
CRect rect;
GetClientRect(rect);
FillWindow(pDC,rect);
return TRUE;
}
void CMainWindow::FillWindow(CDC *pDC,CRect rect)
{
CBrush *pBrush[255];
for (int i=0;i<255;i++)
pBrush[i]=new CBrush(PALETTERGB(0,0,255-i));
CRect pRect;
int nWidth=rect.right-rect.left;
int nHeight=rect.bottom-rect.top;
for (int i=0;i<nHeight;i++)
{
pRect.SetRect(0,i,nWidth,i+1);
pDC->FillRect(&pRect,pBrush[(i*254)/nHeight]);
}
for (int i=0;i<255;i++)
delete pBrush[i];
}
void CMainWindow::OnButtonClicked1()
{
flag=TRUE;
TextBox1.GetWindowText(ipaddress);
TextBox1.EnableWindow(FALSE);
sock2=socket(AF_INET,SOCK_STREAM,IPPROTO_IP);
cli.sin_addr.s_addr=inet_addr(ipaddress);
cli.sin_family=AF_INET;
cli.sin_port=5000;
ListBox2.AddString(CString("对方IP:")+ipaddress);
AfxBeginThread(&Thread2,0);
}
void CMainWindow::OnButtonClicked2()
{
CString buff;
TextBox2.GetWindowText(buff);
send(sock2,strIP+CString(":")+buff,strIP.GetLength()+buff.GetLength()+1,0);
TextBox2.SetWindowText("");
}
void CMainWindow::OnButtonClicked3()
{
CFileDialog dialog(true,"*.*");
if (dialog.DoModal()==IDOK)
{
scount=0;
count=1;
SourceFileName=dialog.GetPathName();
sock3=socket(AF_INET,SOCK_STREAM,IPPROTO_IP);
fcli.sin_addr.s_addr=inet_addr(ipaddress);
fcli.sin_family=AF_INET;
fcli.sin_port=8005;
AfxBeginThread(&Thread3,0);
}
}
UINT Thread4(LPVOID wParam)
{
CFileException ex;
CString FileSize;
while(TRUE)
{
int m_Addlem;
m_Addlem=sizeof(fserv);
msock2=accept(sock4,(sockaddr*)&fserv,&m_Addlem);
char buff[1024]="";
if (msock2!=INVALID_SOCKET)
{
ListBox1.AddString("接受成功");
recv(msock2,buff,sizeof(buff),0);
ListBox1.AddString(buff);
}
DestFileName="C:\\template.tmp";
destFile.Open((LPCTSTR)DestFileName, CFile::modeWrite | CFile::modeCreate, &ex);
buff1=new BYTE[4096];
DWORD dwRead=0;
//destFile.Seek(count,CFile::begin);
count=0;
do{
dwRead=recv(msock2,(char *)buff1,4096,0);
count+=4096;
destFile.Write(buff1,dwRead);
}while (dwRead>0);
destFile.Close();
FileSize.Format("%d",count);
ListBox1.AddString(CString("文件大小:")+CString(buff).Right(CString(buff).GetLength()-CString(buff).ReverseFind(':')-1)+CString(" 完成传输:")+FileSize);
CFileDialog dialog(true,"*.*");
if (dialog.DoModal()==IDOK)
{
CString NewDestFileName=dialog.GetPathName();
destFile.Rename(DestFileName,NewDestFileName);
}
}
closesocket(sock4);
closesocket(msock2);
AfxEndThread(0);
return 0;
}
UINT Thread3(LPVOID wParam)
{
CString FileSize;
CFileException ex;
sourceFile.Open(SourceFileName,CFile::modeRead, &ex);
FileSize.Format("%d",sourceFile.GetLength());
if (connect(sock3,(sockaddr*)&fcli,sizeof(fcli))!=INVALID_SOCKET)
{
ListBox1.AddString("连接成功");
send(sock3,SourceFileName+CString(" :")+FileSize,SourceFileName.GetLength()+FileSize.GetLength()+2,0);
}
buff2=new BYTE[4096];
DWORD dwRead=0;
scount=0;
//sourceFile.Seek(scount,CFile::begin);
do{
dwRead = sourceFile.Read(buff2,4096);
scount+=4096;
send(sock3,(char*)buff2,dwRead,0);
}while (dwRead > 0);
sourceFile.Close();
closesocket(sock3);
AfxEndThread(0);
return 0;
}
UINT Thread2(LPVOID wParam)
{
if (connect(sock2,(sockaddr*)&cli,sizeof(cli))!=INVALID_SOCKET)
{
ConnectNum++;
if (ConnectNum<2)
{
ListBox1.AddString("连接成功");
send(sock2,CString("#")+strIP,strIP.GetLength()+1,0);
}
}
while(TRUE)
{
char buff[1024]="";
//recv(sock2,buff,1024,0);
//ListBox1.AddString(buff);
}
closesocket(sock2);
AfxBeginThread(0);
return 0;
}
UINT Thread1(LPVOID wParam)
{
int i=0;
while(TRUE)
{
int m_Addlem;
m_Addlem=sizeof(serv);
msock1=accept(sock1,(sockaddr*)&serv,&m_Addlem);
if (msock1!=INVALID_SOCKET)
{
ListBox1.AddString("接受成功");
}
while (TRUE)
{
char buff[1024]="";
recv(msock1,buff,1024,0);
if (CString(buff).Left(1)=='#' && strlen(buff)>0)
{
i++;
if (i<2 && !flag)
{
TextBox1.SetWindowText(CString(buff).Right(CString(buff).GetLength()-CString(buff).Find('#')-1));
::SendMessage(Button1.m_hWnd,BM_CLICK, NULL, NULL);
}
}
else if (strlen(buff)>0)
{
ListBox1.AddString(buff);
}
}
}
closesocket(sock1);
closesocket(msock1);
AfxEndThread(0);
return 0;
}
void CMainWindow::CreateSocket()
{
sock1=socket(AF_INET,SOCK_STREAM,IPPROTO_IP);
//广播地址
//serv.sin_addr.s_addr=htonl(INADDR_BROADCAST);
serv.sin_addr.s_addr=htonl(INADDR_ANY);
serv.sin_family=AF_INET;
serv.sin_port=5000;
if (bind(sock1,(sockaddr*)&serv,sizeof(serv)))
{
ListBox1.AddString("----文本服务器创建失败----");
return;
}
else
{
ListBox1.AddString("----文本服务器创建成功----");
listen(sock1,5);
AfxBeginThread(&Thread1,0);
}
}
void CMainWindow::CreateFileSocket()
{
sock4=socket(AF_INET,SOCK_STREAM,IPPROTO_IP);
fserv.sin_addr.s_addr=htonl(INADDR_ANY);
fserv.sin_family=AF_INET;
fserv.sin_port=8005;
if (bind(sock4,(sockaddr*)&fserv,sizeof(fserv)))
{
ListBox1.AddString("----文件服务器创建失败----");
return;
}
else
{
ListBox1.AddString("----文件服务器创建成功----");
listen(sock4,5);
AfxBeginThread(&Thread4,0);
}
}
HBRUSH CMainWindow::OnCtlColor(CDC *pDC, CWnd *pWnd,UINT nCtlColor)
{
HBRUSH br=CFrameWnd::OnCtlColor(pDC,pWnd,nCtlColor);
if (pWnd->m_hWnd==Label1.m_hWnd)
{
pDC->SetBkMode(TRANSPARENT);
pDC->SetTextColor(RGB(255,255,0));
return (HBRUSH)::GetStockObject(NULL_BRUSH);
}
return br;
}
LRESULT CMainWindow::OnNcHitTest(CPoint point)
{
LRESULT nHitTest=CFrameWnd::OnNcHitTest(point);
if (nHitTest==HTCLIENT)
{
nHitTest=HTCAPTION;
}
return nHitTest;
}
BOOL CMainWindow::DestroyWindow()
{
/*flag=TRUE;
sourceFile.Close();
destFile.Close();
closesocket(sock3);
closesocket(sock4);
closesocket(msock2);
CFile file;
CString sizename1;
CString sizename2;
file.Open("c:\\record.log",CFile::modeCreate | CFile::modeWrite);
sizename1.Format("%d",scount);
sizename2.Format("%d",count);
file.Write(SourceFileName+CString("#")+sizename1+CString("#")+sizename2,SourceFileName.GetLength()+sizename1.GetLength()+sizename2.GetLength()+2);
file.Close();*/
CFrameWnd::DestroyWindow();
return TRUE;
}