好開心,多客戶端的乙個網路程式終於通了

2021-04-02 01:18:08 字數 3274 閱讀 3781

網際網路環境, tcp sokcet api程式設計.

初步測試成功. 已經奮戰了好久了.

tcp是乙個可靠的面向連線的傳送服務. 由於ip並不能保證接收的資料報的順序與傳送的相一致,tcp會在收信端裝配tcp資料段並形成乙個不間斷的資料流.

傳送端不斷傳送資料, 接收端在接到之後, 要根據資料報的格式, 重新組包, 對每包資料再分析提取資訊進行處理.

寫這篇文章的時候, 我發現我沒有按照這種方式, 根本就沒有組包這個步驟, 而是用了另一種犧牲效率的方法:

傳送端傳送定長資料報後, 等待接收端返回乙個確認位元組, 傳送端在接到這個確認位元組後, 接著傳送下一包. 這樣, 保證了每次接收到的資料報是定長的. 這種方式避免了組包演算法, 但是嚴重犧牲了效率, 我是該修正一下了...

今天週六, 先不管了. 明天不來搞了, 出去玩! 祝我自己過個好週末吧

轉貼"賽冰河個人站"的"windows網路程式設計經驗小結"

1. 如果在已經處於 established狀態下的socket(一般由埠號和標誌符區分)呼叫

closesocket(一般不會立即關閉而經歷time_wait的過程)後想繼續重用該socket:

bool breuseaddr=true;

setsockopt(s,sol_socket ,so_reuseaddr,(const char*)&breuseaddr,sizeof(bool));

2. 如果要已經處於連線狀態的soket在呼叫closesocket後強制關閉,不經歷

time_wait的過程:

bool bdontlinger = false;

setsockopt(s,sol_socket,so_dontlinger,(const char*)&bdontlinger,sizeof(bool));

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

int nnettimeout=1000;//1秒

//傳送時限

setsockopt(socket,sol_s0cket,so_sndtimeo,(char *)&nnettimeout,sizeof(int));

//接收時限

setsockopt(socket,sol_s0cket,so_rcvtimeo,(char *)&nnettimeout,sizeof(int));

4.在send()的時候,返回的是實際傳送出去的位元組(同步)或傳送到socket緩衝區的位元組

(非同步);系統預設的狀態傳送和接收一次為8688位元組(約為8.5k);在實際的過程中傳送資料

和接收資料量比較大,可以設定socket緩衝區,而避免了send(),recv()不斷的迴圈收發:

// 接收緩衝區

int nrecvbuf=32*1024;//設定為32k

setsockopt(s,sol_socket,so_rcvbuf,(const char*)&nrecvbuf,sizeof(int));

//傳送緩衝區

int nsendbuf=32*1024;//設定為32k

setsockopt(s,sol_socket,so_sndbuf,(const char*)&nsendbuf,sizeof(int));

5. 如果在傳送資料的時,希望不經歷由系統緩衝區到socket緩衝區的拷貝而影響

程式的效能:

int nzero=0;

setsockopt(socket,sol_s0cket,so_sndbuf,(char *)&nzero,sizeof(nzero));

6.同上在recv()完成上述功能(預設情況是將socket緩衝區的內容拷貝到系統緩衝區):

int nzero=0;

setsockopt(socket,sol_s0cket,so_rcvbuf,(char *)&nzero,sizeof(int));

7.一般在傳送udp資料報的時候,希望該socket傳送的資料具有廣播特性:

bool bbroadcast=true;

setsockopt(s,sol_socket,so_broadcast,(const char*)&bbroadcast,sizeof(bool));

8.在client連線伺服器過程中,如果處於非阻塞模式下的socket在connect()的過程中可

以設定connect()延時,直到accpet()被呼叫(本函式設定只有在非阻塞的過程中有顯著的

作用,在阻塞的函式呼叫中作用不大)

bool bconditionalaccept=true;

setsockopt(s,sol_socket,so_conditional_accept,(const char*)&bconditionalaccept,sizeof(bool));

9.如果在傳送資料的過程中(send()沒有完成,還有資料沒傳送)而呼叫了closesocket(),以前我們

一般採取的措施是"從容關閉"shutdown(s,sd_both),但是資料是肯定丟失了,如何設定讓程式滿足具體

應用的要求(即讓沒發完的資料傳送出去後在關閉socket)?

struct linger ;

linger m_slinger;

m_slinger.l_onoff=1;//(在closesocket()呼叫,但是還有資料沒傳送完畢的時候容許逗留)

// 如果m_slinger.l_onoff=0;則功能和2.)作用相同;

m_slinger.l_linger=5;//(容許逗留的時間為5秒)

setsockopt(s,sol_socket,so_linger,(const char*)&m_slinger,sizeof(linger));

note:1.在設定了逗留延時,用於乙個非阻塞的socket是作用不大的,最好不用;

2.如果想要程式不經歷so_linger需要設定so_dontlinger,或者設定l_onoff=0;

10.還乙個用的比較少的是在sdi或者是dialog的程式中,可以記錄socket的除錯資訊:

(前不久做過這個函式的測試,調式資訊可以儲存,包括socket建立時候的引數,採用的

具體協議,以及出錯的**都可以記錄下來)

bool bdebug=true;

setsockopt(s,sol_socket,so_debug,(const char*)&bdebug,sizeof(bool));

......

我帶著滿襟的神傷

跌入茫然的方向

身邊只有匆匆的過往

我們互不相望

python網路程式設計TCP服務多客戶端的服務端開發

服務多客戶端tcp服務端開發 2 方法說明 3 4 bind host,port 表示繫結埠號,host是ip位址,ip位址一般不進 行繫結,表示本機的任何乙個ip位址都行,port是埠號 5 listen backlog 表示設定監聽,backlog引數表示最大等待連線的 個數 6 accept ...

乙個基本的SOCKET客戶端程式

標頭檔案 include include 定義常量 define recv buffer size 8192 主函式 int main int argc,char argv 建立套接字 connectsocket socket af inet,tcp ip協議 sock stream,tcp傳輸 i...

TCP通訊 多客戶端連線乙個伺服器端總結

windows下tcp通訊,多個客戶端連線伺服器端。一 伺服器端流程實現如下 1 通過socket函式,建立基於流式型別的socket,可名為serversocket 2 呼叫bind函式,繫結本地的監聽埠號和本地ip位址 3 呼叫listen函式,開始監聽客戶端請求。其中該函式第二個引數指定了最大...