6.在程序菜单项中添加"本机IP地址":
void CServerView::OnIp() { int WSAReturn; WSAReturn=WSAStartup( 0x0101, &WSAData ); if( WSAReturn == 0 ){ gethostname( Hostname, 260 ); struct hostent *pHostEnt; HostEnt = gethostbyname( Hostname); if( pHostEnt != NULL ){ wsprintf( Hostaddress, "%d.%d.%d.%d", ( pHostEnt- >h_addr_list[0][0] & 0x00ff ), ( pHostEnt - >h_addr_list[0][1] & 0x00ff ), ( pHostEnt- >h_addr_list[0][2] & 0x00ff ), ( pHostEnt- >h_addr_list[0][3] & 0x00ff ) ); CString out; out.Format(Hostaddress); AfxMessageBox(out); } } } |
7.在程序菜单中添加"发送消息":
void CServerView::OnSendmessage() {// TODO: Add your command handler code here char msg[2000]; Csend Sendmessage; if(Sendmessage.DoModal()== IDOK&&!Sendmessage.m_Message.IsEmpty()) { wsprintf(msg,"R: "+ Sendmessage.m_Message); sendto(m_sock,msg,1024,0, (PSOCKADDR)&saClnt,saClntLen); m_data[count++]=Sendmessage.m_Message; flag=TRUE; InvalidateRect(NULL); } } |
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中加入代码:
添加变量:
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); } } |
|