国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

C++ 網絡編程 總結

2020-01-26 15:04:51
字體:
來源:轉載
供稿:網友

第一次用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()會立即返回,并收到多少數據返回多少數據。

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 东乌珠穆沁旗| 洪雅县| 化州市| 留坝县| 临邑县| 屏南县| 西昌市| 万州区| 巴青县| 鄂伦春自治旗| 扶风县| 宁海县| 黄石市| 十堰市| 出国| 叶城县| 龙川县| 东明县| 固阳县| 哈巴河县| 彝良县| 将乐县| 永善县| 乐陵市| 安塞县| 和平县| 海宁市| 丰镇市| 镇江市| 洱源县| 霍林郭勒市| 徐水县| 齐齐哈尔市| 开鲁县| 垣曲县| 瑞金市| 桃江县| 西宁市| 皮山县| 乐东| 克拉玛依市|