C++ 網路編程 總結_C 語言

來源:互聯網
上載者:User

第一次用C++寫程式,對C++ 只是菜鳥層級的,倒是對C#很熟悉。兩者有很大的相似性。但也有不同。

首先寫了一個網路通訊用的小的MFC程式。發現

(1)MFC寫介面真的好麻煩呀。用C#寫的tab 分分鐘搞定的事,用C++害得我寫了兩天.關鍵是不熟練. 還有list control 控制項的表徵圖顯示.  真是很麻煩

         不過,由於最後的 detch() 函數執行後,就真正顯示出來了.這些具體的小細節,一般在 書上都沒有寫.

(2)用C++ 寫類的特徵,基本上與C#是相似的.

說一下網路編程的問題吧

1\一開始並不清楚 C++ 寫程式用的網路通訊端,三類的不一樣的地方.總以為我用的VS2013,用最進階別的通訊端應該更容易一些,於是選用了CSOCKET 結果由於這個通訊端是阻塞模式,結果被卡住了,卡住不知道如何做了.如果對方裝置沒有反應,最不能死等吧,這樣不行.

於上網上搜尋,發現一篇文章寫到 給 CSocket 加上逾時.於時照抄照搬著做了一遍,可惜失敗了.  怎麼查也查不出原因.  按原文章一字一句的比較,也沒有找出原因來.失敗換思路

2\想到低一點的 CAsyncSocket 是非同步作業的.這樣總可以了吧不會阻塞了吧.但是回呼函數使得處理起來也不方便.在什麼時候做處理,就需要訊息做處理.但是也很麻煩.

3\於是,找出書來,大部分書上對於網路部分只是介紹了一個最基本的 Socket ,看起來也挺簡單的. 就先試一下這個最基本的吧.

沒想到 30分鐘後,網路程式測試成功.  而且有逾時接收,逾時發送,等.正合我意.

原來最基本的,才是最好的.

總結一下:

     SOCKET的操作方法

以下是一個網路用戶端的例子:

// client.cpp  #include <iostream> #include <cstdio> #include <Winsock2.h>  using namespace std;  int main() { // 載入socket動態連結程式庫(dll)   WORD wVersionRequested;   WSADATA wsaData;  // 這結構是用於接收Wjndows Socket的結構資訊的   int err;       wVersionRequested = MAKEWORD( 1, 1 );  // 請求1.1版本的WinSock庫       err = WSAStartup( wVersionRequested, &wsaData );   if ( err != 0 ) {     return -1;     // 傳回值為零的時候是表示成功申請WSAStartup   }       if ( LOBYTE( wsaData.wVersion ) != 1 || HIBYTE( wsaData.wVersion ) != 1 ) {     // 檢查這個低位元組是不是1,高位元組是不是1以確定是否我們所請求的1.1版本     // 否則的話,調用WSACleanup()清除資訊,結束函數     WSACleanup( );     return -1;    }    // 建立socket操作,建立流式通訊端,返回通訊端號sockClient   // SOCKET socket(int af, int type, int protocol);   // 第一個參數,指定地址簇(TCP/IP只能是AF_INET,也可寫成PF_INET)   // 第二個,選擇通訊端的類型(流式通訊端),第三個,特定地址家族相關協議(0為自動)   SOCKET sockClient = socket(AF_INET, SOCK_STREAM, 0);  // 將通訊端sockClient與遠程主機相連   // int connect( SOCKET s, const struct sockaddr* name, int namelen);   // 第一個參數:需要進行串連操作的通訊端   // 第二個參數:設定所需要串連的地址資訊   // 第三個參數:地址的長度   SOCKADDR_IN addrSrv;   addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");   // 本地迴路地址是127.0.0.1;    addrSrv.sin_family = AF_INET;   addrSrv.sin_port = htons(6000);   connect(sockClient, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));    char recvBuf[100];   recv(sockClient, recvBuf, 100, 0);   printf("%s\n", recvBuf);    send(sockClient, "Attention: A Client has enter...\n", strlen("Attention: A Client has enter...\n")+1, 0);    printf("我們可以聊五句話");   int n = 5;   do{     printf("\n還剩%d次:", n);     char talk[100];     printf("\nPlease enter what you want to say next(\"quit\"to exit):");     gets(talk);     send(sockClient, talk, strlen(talk)+1, 0);     // 發送資訊      char recvBuf[100];     recv(sockClient, recvBuf, 100, 0);     printf("%s Says: %s\n", "Server", recvBuf);   // 接收資訊   }while(--n);    printf("End linking...\n");   closesocket(sockClient);   WSACleanup();  // 終止對通訊端庫的使用    printf("\n");   system("pause");   return 0; }

關於逾時的處理方法

在send(),recv()過程中有時由於網路狀況等原因,收發不能預期進行,而設定收發逾時控制:

在Linux下需要注意的是時間的控制結構是struct timeval而並不是某一整型數,

在windows下是這樣寫的:

int nNetTimeout=1000;//1秒,//設定發送逾時setsockopt(socket,SOL_SOCKET,SO_SNDTIMEO,(char *)&nNetTimeout,sizeof(int));//設定接收逾時setsockopt(socket,SOL_SOCKET,SO_RCVTIMEO,(char *)&nNetTimeout,sizeof(int));這樣做在Linux環境下是不會產生效果的,須如下定義:struct timeval timeout = {3,0}; //設定發送逾時setsockopt(socket,SOL_SOCKET,SO_SNDTIMEO,(char *)&timeout,sizeof(struct timeval));//設定接收逾時setsockopt(socket,SOL_SOCKET,SO_RCVTIMEO,(char *)&timeout,sizeof(struct timeval));

有兩點注意就是:

1)recv ()的第四個參數需為MSG_WAITALL(設定MSG_DONTWAIT可以不用阻塞在建立串連後在等等接收資料),在阻塞模式下不等到指定數目的資料不會返回,除非逾時時間到。還要注意的是只要設定了接收逾時,在沒有MSG_WAITALL時也是有效。說到底逾時就是不讓你的程式老在那兒等,到一定時間進行一次返回而已。

2)即使等待逾時時間值未到,但對方已經關閉了socket, 則此時recv()會立即返回,並收到多少資料返回多少資料。

以上所述就是本文的全部內容了,希望大家能夠喜歡。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.