C 網路程式設計 總結

2022-10-04 03:57:07 字數 3191 閱讀 4762

第一次用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

#include

#include

using namespace std;

int main()

if ( lobyte( wsadata.wversion ) != 1 || hibyte( wsadata.wversion ) != 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);

connwww.cppcns.comect(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;

dowhile(--n);

printf("end linking...\n");

closesocket(sockclient);

wsacleanup(); // 終止對套接字型檔的使用

printf("\n");

system("pause");

return 0;

}關於超時的處理方法

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

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

在windows下是這樣寫的:

injcagyt 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 = ;

//設定傳送超時

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()會立即返回,並收到多少資料返回多少資料。

本文標題: c++ 網路程式設計 總結

本文位址:

網路程式設計總結

一 確認網路環境3g wifi 1.新增原始檔和framework 1.1.新增原始檔 在你的程式中使用 reachability 只須將該例程中的 reachability.h 和 reachability.m 拷貝到你的工程中。如下圖 1.2.新增framework 將systemconfigu...

網路程式設計總結

osi分為物理層 資料鏈路層 網路層 傳輸層 會話層 表現層 應用層共七層。1.物理層 通過媒介傳輸位元,確定機械和電氣規範。位元bit 2.資料鏈路層 將位元組裝成幀和點對點的傳遞。幀frame 3.網路層 負責資料報從源到宿的傳遞和網際互聯。包packet 4.傳輸層 提供端對端的可靠的報文傳遞...

網路程式設計總結

serversocket 埠號 例項化需要填寫埠號。public serversocket int port throws ioexceptionsocket ip位址,埠號 需要填寫訪問的ip位址和埠號。socket.getoutputstream 返回socket的輸出流。socket.geti...