1. 程式人生 > >[C++] Windows下的socket程式設計(這是一個簡單的TCP/IP例子)

[C++] Windows下的socket程式設計(這是一個簡單的TCP/IP例子)

Socket的概念:

Socket,即套接字,用於描述地址和埠,是一個通訊鏈的控制代碼。

應用程式通過Socket像網路發出請求或者回應。

什麼事客戶/伺服器模式:

在TCP/IP網路應用中,通訊的兩個程序相互作用的主要模式是客戶/伺服器模式,即客戶端向伺服器發出請求,伺服器接收請求後,提供相應的服務。客戶/伺服器模式的建立基於以下兩點:

1:建立網路的起因是網路中軟硬體資源、運算能力和資訊不均等,需要共享,從而造就擁有眾多資源的主機提供服務,資源較少的客戶請求服務這一非對等作用

2:網間程序通訊完全是非同步的,相互通訊的程序間既不存在父子關係,又不共享記憶體緩衝區

因此需要一種機制為希望通訊的程序間建立聯絡,為二者的資料交換提供同步,這就是基於客戶/服務端模式的TCP/IP

(這部分內容摘自socket程式設計原理)

需要做什麼:

客戶端:建立Socket,通過埠號和地址確定目標伺服器,使用Connect連線到伺服器,send傳送訊息,等待處理,通訊完成後呼叫CloseSocket關閉Socket

服務端:建立Socket,宣告自身的埠號和地址並繫結到Socket,使用Listen開啟監聽,然後不斷用Accept去檢視是否有連線,如果有,捕獲Socket,並通過Recv獲取訊息的內容,通訊完成後呼叫CloseSocket關閉這個對應Accept到的Socket,如果不再需要等待任何客戶端連線,那麼用CloseSocket關閉掉自身的Socket

程式碼示例

客戶端:這裡建立一個CLientNet類,用於表示一個客戶

  1. #pragma once
  2. /* 
  3. ClinetNet.h: 
  4. 用於表示一個客戶的網路操作 
  5. */
  6. #include <stdio.h>
  7. #include<windows.h>
  8. #pragma comment(lib, "Ws2_32.lib")
  9. class CClientNet  
  10. {  
  11. public:  
  12.     //連線上指定伺服器
  13.     int Connect(int port,constchar* address);  
  14.     //傳送資訊
  15.     int SendMsg(constchar* msg,int len);  
  16.     //關閉
  17.     void Close();  
  18. private:  
  19.     SOCKET m_sock;  
  20. };  

  1. /* 
  2. CLientNet.cpp 
  3. */
  4. #include "ClientNet.h"
  5. int CClientNet::Connect( int port,constchar* address )  
  6. {  
  7.     int rlt = 0;  
  8.     //用於記錄錯誤資訊並輸出
  9.     int iErrMsg;  
  10.     //啟動WinSock
  11.     WSAData wsaData;  
  12.     iErrMsg = WSAStartup(MAKEWORD(1,1),&wsaData);  
  13.     if (iErrMsg != NO_ERROR)  
  14.         //有錯誤
  15.     {  
  16.         printf("failed with wsaStartup error : %d\n",iErrMsg);  
  17.         rlt = 1;  
  18.         return rlt;  
  19.     }  
  20.     //建立Socket
  21.     m_sock = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);  
  22.     if (m_sock == INVALID_SOCKET)  
  23.         //建立Socket失敗
  24.     {  
  25.         printf("socket failed with error : %d\n",WSAGetLastError());  
  26.         rlt = 2;  
  27.         return rlt;  
  28.     }  
  29.     //目標伺服器資料
  30.     sockaddr_in sockaddrServer;  
  31.     sockaddrServer.sin_family = AF_INET;  
  32.     sockaddrServer.sin_port = port;  
  33.     sockaddrServer.sin_addr.s_addr = inet_addr(address);  
  34.     //連線,sock與目標伺服器連線
  35.     iErrMsg = connect(m_sock,(sockaddr*)&sockaddrServer,sizeof(sockaddrServer));  
  36.     if (iErrMsg < 0)  
  37.     {  
  38.         printf("connect failed with error : %d\n",iErrMsg);  
  39.         rlt = 3;  
  40.         return rlt;  
  41.     }  
  42.     return rlt;  
  43. }  
  44. int CClientNet::SendMsg(constchar* msg,int len)  
  45. {  
  46.     int rlt = 0;  
  47.     int iErrMsg = 0;  
  48.     //傳送訊息,指定sock傳送訊息
  49.     iErrMsg = send(m_sock,msg,len,0);  
  50.     if (iErrMsg < 0)  
  51.         //傳送失敗
  52.     {  
  53.         printf("send msg failed with error : %d\n",iErrMsg);  
  54.         rlt = 1;  
  55.         return rlt;  
  56.     }  
  57.     return rlt;  
  58. }  
  59. void CClientNet::Close()  
  60. {  
  61.     closesocket(m_sock);  
  62. }  

  1. #include "ClientNet.h"
  2. void main()  
  3. {  
  4.     CClientNet client;  
  5.     //連線到127.0.0.1(即本地),埠號為8888的服務端
  6.     printf("Connect\n");  
  7.     client.Connect(8888,"127.0.0.1");  
  8.     //傳送訊息
  9.     printf("send msg\n");  
  10.     client.SendMsg("hello\0",sizeof("hello\0"));  
  11.     //關閉socket
  12.     printf("close\n");  
  13.     client.Close();  
  14.     system("pause");  
  15. }  


服務端程式碼:

  1. #pragma once
  2. /* 
  3. ServerNet.h 
  4. 用於表示服務端的網路操作 
  5. */
  6. #include <stdio.h>
  7. #include <winsock.h>
  8. #pragma comment (lib,"ws2_32.lib")
  9. class CServerNet  
  10. {  
  11. public:  
  12.     //初始化伺服器,返回0表示成功
  13.     int Init(constchar* address,int port);  
  14.     //更新資料
  15.     void Run();  
  16. 相關推薦

    **c++基於tcp協議的socket程式設計實現一個簡單伺服器**

    c++基於tcp協議的socket程式設計實現一個簡單伺服器 基於tcp的通訊,可以利益socket套接字實現。通訊,顧名思義需要伺服器和客戶端兩者進行資訊互動。 通過流程圖我們可以看到程式設計實現伺服器和客戶端的步驟大致相同,而伺服器則更為複雜一些。本文之給出了一個簡單的伺服器程式設計和

    Windows的File Mapping一個簡單的封裝

    {        AM_READ =0,    /**////< 讀        AM_WRITE        ///< 寫    };public:    SharedMemory(const std::string& name, std::size_t size, AccessMo

    windows socket程式設計

     一、基於TCP的socket程式設計 伺服器端程式: 1)建立套接字(socket)。 此係統呼叫的實際效果是,請求作業系統把網路通訊所需要的一些系統資源(儲存器空間、CPU時間、網路寬頻等)分配給該應用程序。 2)將套接字繫結到一個本地地址和埠上(bind)。

    UDP windowssocket程式設計例項

    Server 端程式原始碼: #include <stdio.h> #include <Winsock2.h> void main() { SOCKET socket1; //InitWinsock();  WSADATA wsaData;     int iErrorCode;   

    socket程式設計一個簡單的hello world程式

    一些理論的東西,我在這裡一概不提,我們先看例子程式,關於理論的部分,我會在後續的部落格中會進行詳細的說明。 首先我們來看一個socket的一個簡單的hello world程式, 我們首先來完成第一個需求: (1) 讓客戶端和伺服器端建立起連線 那麼我們必須要有一個客戶端程式

    Linuxsocket程式設計之UDP簡單實現

    本文實現一個簡單的UDP小例子,來說明Linux下socket程式設計之UDP的簡單實現。本文主要包括三個部分:伺服器端的實現,客服端的實現和通訊測試。實現的功能:客服端傳送一條訊息給伺服器端,伺服器

    windowssocket程式設計,多執行緒

    sercer端 #include <stdio.h> #include <process.h> #include <Winsock2.h> #pragma comment(lib,"ws2_32.lib") void send(void

    linuxsocket程式設計實現一個伺服器連線多個客戶端

    使用socekt通訊一般步驟     1)伺服器端:socker()建立套接字,繫結(bind)並

    Linuxsocket程式設計之多程序TCP伺服器端

    程式碼如下: tcp_server.c #include<string.h> #include<stdlib.h> #include<stdio.h> #include<sys/types.h> #includ

    [C++] Windowssocket程式設計(一個簡單TCP/IP例子)

    Socket的概念: Socket,即套接字,用於描述地址和埠,是一個通訊鏈的控制代碼。 應用程式通過Socket像網路發出請求或者回應。 什麼事客戶/伺服器模式: 在TCP/IP網路應用中,通訊的兩個程序相互作用的主要模式是客戶/伺服器模

    WindowsC語言的Socket程式設計例子TCP和UDP)

    1 #include "stdafx.h" 2 #include <stdio.h> 3 #include <winsock2.h> 4 5 #pragma comment(lib,"ws2_32.lib") 6 7 int main(int argc, char

    c++ 網絡編程(四)TCP/IP LINUX/windows socket 基於I/O復用的服務器端代碼 解決多進程服務端創建進程資源浪費問題

    linux系統中 cin 通過 sel print 大小 查看 服務 集合 原文作者:aircraft 原文鏈接:https://www.cnblogs.com/DOMLX/p/9613861.html 好了,繼上一篇說到多進程服務端也是有缺點的,每創建一個

    [原始碼和文件分享]基於C語言的Linux環境socket程式設計

    一 需求分析 柏克萊套接字,又稱為BSD 套接字是一種應用程式介面,用於網際插座與Unix域套接字,包括了一個用C語言寫成的應用程式開發庫,主要用於實現程序間通訊,在計算機網路通訊方面被廣泛使用。 使用Berkeley套接字的系統有很多,本系統是在Ubuntu下用C語言進行socket程式設

    c++ 網路程式設計(九)TCP/IP LINUX/windows 多執行緒超詳細教程 以及 多執行緒實現服務端

    #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <process.h> #include <winsock2.h> #include <win

    c++ 網路程式設計(九)TCP/IP LINUX/windows 多執行緒超詳細教程 以及 多執行緒實現服務端

    原文作者:aircraft 原文連結:https://www.cnblogs.com/DOMLX/p/9661012.html  先講Linux下(windows下在後面可以直接跳到後面看): 一.執行緒基本概念 前面我們講過多程序伺服器,但我們知道它開銷很大

    C++程式設計練習——一個簡單的石頭剪刀布遊戲

    #include<iostream> using namespace std; int main() { char player1, player2; int start; cout << "這是一個石頭剪刀布的遊戲,如果你想開

    Windows用Codeblocks建立一個簡單的DLL動態連結庫

    建立一個最簡單的只有一個get_id() 函式的DLL庫  一、建立C語言動態連結庫 1.新建一個動態庫的工程 File - New - Project - DLL - Go 新建的工程原來的main.cpp和main.h刪除,新建兩個檔案simple.

    C#版 Socket程式設計(最簡單Socket通訊功能)

     示例程式是同步套接字程式,功能很簡單,只是客戶端發給伺服器一條資訊,伺服器向客戶端返回一條資訊;這裡只是一個簡單的示例,是一個最基本的socket程式設計流程,在接下來的文章中,會依次記錄套接字的同步和非同步,以及它們的區別。 下面是示例程式的簡單步驟說明 伺服器端:

    C++伺服器(一):瞭解Linuxsocket程式設計

    最近想要用C++寫個socket的伺服器,用於日常的專案開發。 不過,我是新手,那就慢慢地學習一下吧。 Server #include<iostream> using namespace std; //head files of

    windows環境Socket程式設計的幾種模型

    阻塞模型, 這個模型是講解計算機網路時被作為例子介紹的,也是最簡單的。其基本原理是:首先建立一個socket連線,然後對其進行操作,比如,從該socket讀資料。因為網路傳輸是要一定的時間的,即使網路通暢的情況下,接受資料的操作也要花費時間。對於一個簡單的單執行緒程式,接收資料的過程是無法處理其他操作的。