用vc6.0編伺服器與客戶機互相傳送訊息的程式

來源:互聯網
上載者:User
用vc6.0編伺服器與客戶機互相傳送訊息的程式

----

南京理工大學 朱曉華

---- 網路編程已經成為一種時髦,以TCP/IP協議的網路更為流行.自己編一個伺服器與客戶機互相傳送訊息的程式,以便增加自己網路編程的經驗.下面我就介紹一下我編的程式.

---- 首先介紹伺服器程式:

---- 1.建立一個名為"server"的項目,單一文件介面.

---- 2.在serverview.h中加入代碼:

#include "winsock.h"  添加變數:CSize sizeTotal;//控制捲軸intcount;//資訊條數CString m_data[1000];//資訊存放char    Hostname[260];char Hostaddress[20];//主機IP地址SOCKET m_sock;HANDLE m_hListenThread;//線程BOOL m_bInitialized;//是否初始化WSADATAWSAData;BOOL flag;SOCKADDR_IN saClnt;int saClntLen;BOOL Isconnect;//是否串連

----

3.在serverview.cpp中重載CServerView()構造器,建立並綁定嵌套字:

CServerView::CServerView(){// TODO: add construction code hereIsconnect=FALSE;flag=FALSE;sizeTotal.cy=350;sizeTotal.cx=300;m_hListenThread;count=5;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(5050);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]+="Listening....";}elsem_data[4]+="Failed";} 

----

4.在解構函式中完成必需的清除操作:

CServerView::~CServerView(){if(m_bInitialized)WSACleanup();closesocket(m_sock);if(m_hListenThread)::TerminateThread(m_hListenThread,0);}

----

5.定義接收和處理訊息的線程:

long WINAPI Listen(CServerView *pView){char msg[2000]="";intnchar;SOCKADDR_IN saClnt;int saClntLen;while(1){saClntLen=sizeof(saClnt);nchar=recvfrom(pView->m_sock,msg,1024,0,(PSOCKADDR)&saClnt,&saClntLen);if(nchar<0) { pView->m_data[pView->count++]+="Error in recvfrom/n";pView->InvalidateRect(NULL);}else{switch(msg[0]){case'A':wsprintf(msg,"A: Client from %s attached/n",inet_ntoa(saClnt.sin_addr));pView->m_data[pView->count++]=msg;pView->flag=TRUE;pView->InvalidateRect(NULL);pView->Isconnect=TRUE;pView->saClnt=saClnt;pView->saClntLen=saClntLen;sendto(pView->m_sock,msg,1024,0,(PSOCKADDR)&saClnt,saClntLen);break;case 'D':wsprintf(msg,"D: Client form %s detached/n",inet_ntoa(saClnt.sin_addr));pView->m_data[pView->count++]=msg;pView->flag=TRUE;pView->InvalidateRect(NULL);pView->Isconnect=FALSE;sendto(pView->m_sock,msg,1024,0,(PSOCKADDR)&saClnt,saClntLen);break;case 'R':saClntLen=sizeof(saClnt);pView->m_data[pView->count++]=msg;pView->flag=TRUE;pView->InvalidateRect(NULL);break;default:break;}}}return(0);}

----

6.在程式功能表項目中添加"本機IP地址":

void CServerView::OnIp() {int WSAReturn;WSAReturn=WSAStartup( 0x0101, &WSAData );if( WSAReturn == 0 ){gethostname( Hostname, 260 );struct hostent *pHostEnt;pHostEnt = 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 herechar 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 herepCmdUI->Enable(FALSE);if(Isconnect)pCmdUI->Enable(TRUE);}

----

10.再視窗顯示訊息:

void CServerView::OnDraw(CDC* pDC){if(flag){sizeTotal.cy+=20;for(int j=65;jTextOut(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;BOOLIsconnect;int count;CSize sizeTotal;BOOLflag;

----

3.在建構函式中初始設定變數:

CClientView::CClientView(){// TODO: add construction code hereIsconnect=FALSE;sizeTotal.cy=350;sizeTotal.cx=300;flag=FALSE;}

----

4.在解構函式中完成清除操作:

CClientView::~CClientView(){if(m_bInitialized)WSACleanup();closesocket(m_sock);if(m_hListenThread)::TerminateThread(m_hListenThread,0);}

----

5.在菜單中添加"撥號"項:

void CClientView::OnDial() {// TODO: Add your command handler code herecount=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....";}elsem_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 herepCmdUI->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++網路編程的優點,你還可以添加其它功能項,在這我就不多加敘述了.希望我的程式能起到拋磚引玉的目的,讓我們都能編出好的網路程式.

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.