最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++ 網(wǎng)絡(luò)編程 總結(jié)

 更新時(shí)間:2015年06月29日 11:43:20   投稿:hebedich  
這篇文章主要介紹了C++ 網(wǎng)絡(luò)編程的一些詳細(xì)相關(guān)內(nèi)容,有需要的小伙伴可以參考下。

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

首先寫了一個(gè)網(wǎng)絡(luò)通訊用的小的MFC程序。發(fā)現(xiàn)

(1)MFC寫界面真的好麻煩呀。用C#寫的tab 分分鐘搞定的事,用C++害得我寫了兩天.關(guān)鍵是不熟練. 還有l(wèi)ist control 控件的圖標(biāo)顯示.  真是很麻煩

         不過,由于最后的 detch() 函數(shù)執(zhí)行后,就真正顯示出來了.這些具體的小細(xì)節(jié),一般在 書上都沒有寫.

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

說一下網(wǎng)絡(luò)編程的問題吧

1\一開始并不清楚 C++ 寫程序用的網(wǎng)絡(luò)套接字,三類的不一樣的地方.總以為我用的VS2013,用最高級別的套接字應(yīng)該更容易一些,于是選用了CSOCKET 結(jié)果由于這個(gè)套接字是阻塞模式,結(jié)果被卡住了,卡住不知道如何做了.如果對方設(shè)備沒有反應(yīng),最不能死等吧,這樣不行.

于上網(wǎng)上搜索,發(fā)現(xiàn)一篇文章寫到 給 CSocket 加上超時(shí).于時(shí)照抄照搬著做了一遍,可惜失敗了.  怎么查也查不出原因.  按原文章一字一句的比較,也沒有找出原因來.失敗換思路

2\想到低一點(diǎn)的 CAsyncSocket 是異步操作的.這樣總可以了吧不會阻塞了吧.但是回調(diào)函數(shù)使得處理起來也不方便.在什么時(shí)候做處理,就需要消息做處理.但是也很麻煩.

3\于是,找出書來,大部分書上對于網(wǎng)絡(luò)部分只是介紹了一個(gè)最基本的 Socket ,看起來也挺簡單的. 就先試一下這個(gè)最基本的吧.

沒想到 30分鐘后,網(wǎng)絡(luò)程序測試成功.  而且有超時(shí)接收,超時(shí)發(fā)送,等.正合我意.

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

總結(jié)一下:

     SOCKET的操作方法

以下是一個(gè)網(wǎng)絡(luò)客戶端的例子:

// client.cpp 
 
#include <iostream> 
#include <cstdio> 
#include <Winsock2.h> 
 
using namespace std; 
 
int main() 
{ 
// 加載socket動態(tài)鏈接庫(dll) 
  WORD wVersionRequested; 
  WSADATA wsaData;  // 這結(jié)構(gòu)是用于接收Wjndows Socket的結(jié)構(gòu)信息的 
  int err; 
    
  wVersionRequested = MAKEWORD( 1, 1 );  // 請求1.1版本的WinSock庫 
    
  err = WSAStartup( wVersionRequested, &wsaData ); 
  if ( err != 0 ) { 
    return -1;     // 返回值為零的時(shí)候是表示成功申請WSAStartup 
  } 
    
  if ( LOBYTE( wsaData.wVersion ) != 1 || HIBYTE( wsaData.wVersion ) != 1 ) { 
    // 檢查這個(gè)低字節(jié)是不是1,高字節(jié)是不是1以確定是否我們所請求的1.1版本 
    // 否則的話,調(diào)用WSACleanup()清除信息,結(jié)束函數(shù) 
    WSACleanup( ); 
    return -1;  
  } 
   
// 創(chuàng)建socket操作,建立流式套接字,返回套接字號sockClient 
  // SOCKET socket(int af, int type, int protocol); 
  // 第一個(gè)參數(shù),指定地址簇(TCP/IP只能是AF_INET,也可寫成PF_INET) 
  // 第二個(gè),選擇套接字的類型(流式套接字),第三個(gè),特定地址家族相關(guān)協(xié)議(0為自動) 
  SOCKET sockClient = socket(AF_INET, SOCK_STREAM, 0); 
 
// 將套接字sockClient與遠(yuǎn)程主機(jī)相連 
  // int connect( SOCKET s, const struct sockaddr* name, int namelen); 
  // 第一個(gè)參數(shù):需要進(jìn)行連接操作的套接字 
  // 第二個(gè)參數(shù):設(shè)定所需要連接的地址信息 
  // 第三個(gè)參數(shù):地址的長度 
  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);     // 發(fā)送信息 
 
    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; 
}

關(guān)于超時(shí)的處理方法

在send(),recv()過程中有時(shí)由于網(wǎng)絡(luò)狀況等原因,收發(fā)不能預(yù)期進(jìn)行,而設(shè)置收發(fā)超時(shí)控制:

在Linux下需要注意的是時(shí)間的控制結(jié)構(gòu)是struct timeval而并不是某一整型數(shù),

在windows下是這樣寫的:

int nNetTimeout=1000;//1秒,
//設(shè)置發(fā)送超時(shí)
setsockopt(socket,SOL_SOCKET,SO_SNDTIMEO,(char *)&nNetTimeout,sizeof(int));
//設(shè)置接收超時(shí)
setsockopt(socket,SOL_SOCKET,SO_RCVTIMEO,(char *)&nNetTimeout,sizeof(int));

這樣做在Linux環(huán)境下是不會產(chǎn)生效果的,須如下定義:

struct timeval timeout = {3,0}; 
//設(shè)置發(fā)送超時(shí)
setsockopt(socket,SOL_SOCKET,SO_SNDTIMEO,(char *)&timeout,sizeof(struct timeval));

//設(shè)置接收超時(shí)
setsockopt(socket,SOL_SOCKET,SO_RCVTIMEO,(char *)&timeout,sizeof(struct timeval));

有兩點(diǎn)注意就是:

1)recv ()的第四個(gè)參數(shù)需為MSG_WAITALL(設(shè)置MSG_DONTWAIT可以不用阻塞在建立連接后在等等接收數(shù)據(jù)),在阻塞模式下不等到指定數(shù)目的數(shù)據(jù)不會返回,除非超時(shí)時(shí)間到。還要注意的是只要設(shè)置了接收超時(shí),在沒有MSG_WAITALL時(shí)也是有效的。說到底超時(shí)就是不讓你的程序老在那兒等,到一定時(shí)間進(jìn)行一次返回而已。

2)即使等待超時(shí)時(shí)間值未到,但對方已經(jīng)關(guān)閉了socket, 則此時(shí)recv()會立即返回,并收到多少數(shù)據(jù)返回多少數(shù)據(jù)。

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

相關(guān)文章

  • 深入C++可見性與生命期的區(qū)別詳解

    深入C++可見性與生命期的區(qū)別詳解

    本篇文章對C++中可見性與生命期的區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C語言鏈表實(shí)現(xiàn)圖書管理系統(tǒng)

    C語言鏈表實(shí)現(xiàn)圖書管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語言鏈表實(shí)現(xiàn)圖書管理系統(tǒng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • Qt將數(shù)據(jù)庫中的數(shù)據(jù)導(dǎo)出為html

    Qt將數(shù)據(jù)庫中的數(shù)據(jù)導(dǎo)出為html

    這篇文章主要為大家詳細(xì)介紹了Qt如何實(shí)現(xiàn)將數(shù)據(jù)庫中的數(shù)據(jù)導(dǎo)出為html,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-12-12
  • 在Visual Studio中配置C++最新版netCDF庫的方法

    在Visual Studio中配置C++最新版netCDF庫的方法

    本文介紹在Windows電腦的Visual Studio軟件中,配置C++ 語言最新版netCDF庫的方法,文中通過圖文結(jié)合的形式介紹的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下
    2024-03-03
  • C++中如何修改const變量你知道嗎

    C++中如何修改const變量你知道嗎

    這篇文章主要為大家詳細(xì)介紹了C++修改const變量,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • C++ 模擬實(shí)現(xiàn)list(迭代器)實(shí)現(xiàn)代碼

    C++ 模擬實(shí)現(xiàn)list(迭代器)實(shí)現(xiàn)代碼

    這篇文章主要介紹了C++ 模擬實(shí)現(xiàn)list(迭代器)實(shí)現(xiàn)代碼的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • C++11標(biāo)準(zhǔn)庫bind函數(shù)應(yīng)用教程

    C++11標(biāo)準(zhǔn)庫bind函數(shù)應(yīng)用教程

    bind函數(shù)定義在頭文件functional中,可以將bind函數(shù)看做成一個(gè)通用的函數(shù)適配器,他接收一個(gè)可調(diào)用對象,生成一個(gè)新的可調(diào)用對象來"適應(yīng)"原對象的參數(shù)列表。本文將帶大家詳細(xì)了解一下bind函數(shù)的應(yīng)用詳解
    2021-12-12
  • 徹底掌握C語言strcpy函數(shù)的用法

    徹底掌握C語言strcpy函數(shù)的用法

    C語言中的strcpy函數(shù),是一種C語言的標(biāo)準(zhǔn)庫函數(shù),它用于對字符串進(jìn)行復(fù)制。本章帶你了解它的使用并模擬實(shí)現(xiàn)它
    2022-05-05
  • C++文件輸入輸出fstream使用方法

    C++文件輸入輸出fstream使用方法

    C++標(biāo)準(zhǔn)庫提供了<fstream>頭文件,其中包含了用于文件輸入輸出的相關(guān)類和函數(shù),本文將詳細(xì)介紹<fstream>頭文件的使用方法,包括函數(shù)原型、打開文件、讀取和寫入文件、以及錯(cuò)誤處理等注意事項(xiàng),感興趣的朋友跟隨小編一起看看吧
    2023-10-10
  • C++如何調(diào)用python并取返回值

    C++如何調(diào)用python并取返回值

    這篇文章主要介紹了C++如何調(diào)用python并取返回值問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-03-03

最新評論

葵青区| 逊克县| 包头市| 辛集市| 巴林左旗| 昌江| 六盘水市| 万全县| 丁青县| 营口市| 莱阳市| 仪陇县| 彩票| 突泉县| 望奎县| 黑河市| 神池县| 揭西县| 江川县| 陇川县| 堆龙德庆县| 铜陵市| 洪泽县| 松原市| 灌南县| 漳州市| 连江县| 宁国市| 沂南县| 新干县| 呼伦贝尔市| 荣成市| 子洲县| 化州市| 磐石市| 夏河县| 璧山县| 永新县| 托里县| 泌阳县| 高阳县|