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