📄 用vc6制作互通消息.txt
字号:
}
}
---- 8.为发送消息项添加一个对话框的类,名为send,有一个文
本框,用来发送消息.并为文本框添加CString m_Message 变量,
并在ServerView.cpp中添加#include "send.h"
----
---- 9.为发送消息项添加一个判断函数:
void CServerView::OnUpdateSendmessage(CCmdUI* pCmdUI)
{// TODO: Add your command update UI handler code here
pCmdUI- >Enable(FALSE);
if(Isconnect)
pCmdUI- >Enable(TRUE);
}
10.再窗口显示消息:
void CServerView::OnDraw(CDC* pDC)
{ if(flag)
{ sizeTotal.cy+=20;
for(int j=65;j< m_data[count-1].GetLength();j++)
sizeTotal.cx+=15;
OnInitialUpdate();
flag=FALSE;
}
CServerDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
int y=10;
for(int i=0;i< count;i++)
{ pDC- >TextOut(10,y,m_data[i]);
y+=20;
}
// TODO: add draw code for native data here
}
11.在Project中点击Settings中选择Link项添加wsock32.lib.
最后编译程序,就可以得到Server.exe程序.
现在介绍客户机程序:
1.创建一个名为"client"的项目,单文档界面.
2.在clientview.h中加入代码:
#include "winsock.h"
添加变量:
CString m_data[1000];
HANDLE m_hListenThread;
SOCKET m_sock;
SOCKADDR_IN m_saSrvr;
BOOL Isconnect;
int count;
CSize sizeTotal;
BOOL flag;
3.在构造函数中初始化变量:
CClientView::CClientView()
{ // TODO: add construction code here
Isconnect=FALSE;
sizeTotal.cy=350;
sizeTotal.cx=300;
flag=FALSE;
}
4.在析构函数中完成清除操作,代码如上:
5.在菜单中添加"拨号"项:
void CClientView::OnDial()
{// TODO: Add your command handler code here
count=5;
if(m_bInitialized)
{ AfxMessageBox("Already dialing");
return;
}
Cdial dial;
if(dial.DoModal()==IDOK&&!dial.
m_HostAddress.IsEmpty())
{m_saSrvr.sin_family=AF_INET;
m_saSrvr.sin_addr.S_un.S_addr
=htonl(INADDR_ANY);
m_saSrvr.sin_addr.S_un.S_addr
=inet_addr(dial.m_HostAddress);
m_saSrvr.sin_port=htons(5050);
int status;
WSADATA wsaData;
m_data[0]="initializing Windows Sockets DLL....";
if((status=WSAStartup(0x0101,&wsaData))==0)
{ m_data[0]+="Succeeded";
m_bInitialized=TRUE;
}
else
{ m_bInitialized=FALSE;
}
m_sock=socket(AF_INET,SOCK_DGRAM,0);
m_data[1]="Creating socket....";
if(m_sock==INVALID_SOCKET)
{ m_data[1]+="Failed";
}
m_data[1]+="Succeeded";
m_data[2]="Binding socket....";
sockaddr_in sa;
sa.sin_family=AF_INET;
sa.sin_addr.S_un.S_addr=
htonl(INADDR_ANY);
sa.sin_port=htons(0);
if(bind(m_sock,(PSOCKADDR)&sa,
sizeof(sa))==SOCKET_ERROR)
{ m_data[2]+="Failed";
closesocket(m_sock);
}
m_data[2]+="Succeeded";
m_data[3]="Creating listener thread....";
unsigned long idThread;
m_hListenThread=CreateThread(NULL,0,
(LPTHREAD_START_ROUTINE)Listen,
(void *)this,0,&idThread);
if(m_hListenThread)
{ m_data[3]+="Succeeded";
m_data[4]+="Waiting....";
}
else
m_data[4]+="Failed";
InvalidateRect(NULL);
}
}
---- 6.添加一个拨号对话框,名为dial,有一个文本框用来写IP
地址.并在clientview.cpp中添加代码:
#include dial.h
7.在拨号项添加一个判断函数:
void CClientView::OnUpdateDial(CCmdUI* pCmdUI)
{// TODO: Add your command update UI handler code here
pCmdUI- >Enable(TRUE);
if(Isconnect)
pCmdUI- >Enable(FALSE);
}
8.添加接收与发送消息的线程:
long WINAPI Listen(CClientView *pView)
{ char msg[2000];
pView- >m_data[5]="Sending ATTACH command";
pView- >InvalidateRect(NULL);
wsprintf(msg,"A: ");
sendto(pView- >m_sock,msg,1024,0,
(PSOCKADDR)&pView- >m_saSrvr,sizeof(pView- >m_saSrvr));
int saSrvrLen ,nchar;
while(1)
{ saSrvrLen=sizeof(pView- >m_saSrvr);
nchar=recvfrom(pView- >m_sock,msg,
1024,0,(PSOCKADDR)&pView- >m_saSrvr,&saSrvrLen);
if(nchar< 0)
{ pView- >m_data[pView- >count++]
="Error in recvform";
pView- >InvalidateRect(NULL);
}
else
{ pView- >m_data[pView- >count++]=msg;
pView- >Isconnect=TRUE;
pView- >flag=TRUE;
pView- >InvalidateRect(NULL);
}
}
return(0);
}
---- 9.同主程序一样做一个发送消息项,代码如上.
---- 10.显示程序也与主程序一样,代码如上.
---- 11.在Project中点击Settings中选择Link项添加
wsock32.lib.
---- 12.编译程序便可得到client.exe程序.
---- server.exe 和 client.exe 做完后,就可以在具有TCP/IP
协议下的网络中执行.
---- 通过上面的例子,你可以很快了解vc++网络编程的优点,你
还可以添加其它功能项,在这我就不多加叙述了.希望我的程序能
起到抛砖引玉的目的,让我们都能编出好的网络程序.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -