客戶服務器編程示例

先建立兩個工程ServerClient,添加StdAfx.hWINSOCK2.h兩個頭文件,然後編寫下面的兩段代碼:

Server.cpp:

#include "StdAfx.h"

#include "WINSOCK2.h"

#include <iostream>

#define _TCHAR char

#pragma   comment(lib, "ws2_32.lib ") 

using namespace std;

int main(int argc, _TCHAR* argv[])

{

         WSADATA                       wsaData;

         SOCKET                          ListeningSocket;

         SOCKADDR_IN                ServerAddr;

         SOCKET                          NewConnection;

         SOCKADDR_IN                ClientAddr;

         int                                    Port = 5150;

         WSAStartup(MAKEWORD(2,2), &wsaData);// 初始化Windows Socket 2.2

        ListeningSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//創建一個新的Socket來響應 客戶端的連接請求;AF_INET字段是表示網絡地址的類型,AF_INET表示是internet域中進行通信;SOCK_STREAM表示socket的類型,SOCK_STREAM表示是流套接字IPPROTO_TCP表明協議類型,IPPROTO_TCP或者0表示TCP/IP協議

   

        ServerAddr.sin_family = AF_INET;                                                         // 填寫服務器地址信          

        ServerAddr.sin_port = htons(Port);                                                        // 端口爲5150

        ServerAddr.sin_addr.s_addr = htonl(INADDR_ANY);//INADDR_ANY表示機器上的所用網絡地址 比如你的機器上有兩張網卡,那麼到達這兩張網卡的數據,你的socket都可以得到通知;htonlIP地址轉換爲網絡格式

        bind(ListeningSocket, (SOCKADDR *)&ServerAddr, sizeof(ServerAddr));        //綁定監聽端口;當調用socket函數創建套接字後,該套接字並沒有與本機地址和端口等信息相連,bind函數將完成這些工作

       

        listen(ListeningSocket, 2);                                                                                 // 開始監聽,指定最大同時連接數爲2

        int len = sizeof(ClientAddr);

        NewConnection = accept(ListeningSocket, (SOCKADDR *) &ClientAddr, &len);// 接受新的連接

        cout << "************************************************" << endl;

        cout << "****new client has been connected******" << endl;

        cout << "*************************************************" << endl;

         /* 當連接建立之後,我們就可以在這裏和client進行通信,傳輸數據了*/

        closesocket(NewConnection);                                                                               //關閉連接

        closesocket(ListeningSocket);                                                                              //並關閉監聽Socket

        WSACleanup();                                                                                                     // 釋放Windows Socket DLL的相關資源

getchar();

        return 0;

}

Client.cpp:

#include "StdAfx.h"

#include "WINSOCK2.h"

#include <iostream>

#define _TCHAR char

#pragma comment(lib,"ws2_32.lib")

using namespace std;

int main(int argc, _TCHAR* argv[])

{

        WSADATA                   wsaData;

        SOCKET                     s;

        SOCKADDR_IN          ServerAddr;

        int                                Port = 5150;   

        WSAStartup(MAKEWORD(2,2), &wsaData);                                               //初始化Windows Socket 2.2      

        s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);                           // 創建一個新的Socket來連接服務器  

       ServerAddr.sin_family = AF_INET;

       ServerAddr.sin_port = htons(Port);    

       ServerAddr.sin_addr.s_addr = inet_addr("127.0.0.1");                                //在程序中我與本機進行通信

       int result = connect(s, (SOCKADDR *) &ServerAddr, sizeof(ServerAddr));   // 向服務器發出連接請求

       if(result == 0){                                                                                                //result==0表示連接成功

               cout << "Client has connected to server!";

      }

       closesocket(s);

       WSACleanup();

   getchar();

       return 0;

}

附:StdAfx.h的代碼

// stdafx.h : include file for standard system include files,

//  or project specific include files that are used frequently, but

//      are changed infrequently

//

#if !defined(AFX_STDAFX_H__394205FE_C7DC_42D4_B4B5_93EC44EB784C__INCLUDED_)

#define AFX_STDAFX_H__394205FE_C7DC_42D4_B4B5_93EC44EB784C__INCLUDED_

#if _MSC_VER > 1000

#pragma once

#endif // _MSC_VER > 1000

#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers

#include <stdio.h>

// TODO: reference additional headers your program requires here

//{{AFX_INSERT_LOCATION}}

// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_STDAFX_H__394205FE_C7DC_42D4_B4B5_93EC44EB784C__INCLUDED_)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章