Socket程式設計小結

2021-08-02 10:01:05 字數 1989 閱讀 5295

本部分內容是對之前部落格【 ubuntu下進行socket程式設計】中的補充說明,在這篇部落格中,我將詳細解釋socket程式設計的**,分析程式設計的流程和思想。

宣告:本部分**分別引用自【linux c socket程式設計原理及簡單例項】以及【linux網路程式設計:socket檔案傳輸範例】。

首先我們先分析第乙份較為簡單的**,使用socket程式設計完成乙個兩個控制台視窗之間通訊的demo。

在分析之前,我推薦你先看一下這篇部落格【簡單理解socket】,上面很詳細的解釋說明了socket程式設計的過程中,伺服器端和客戶端分別需要呼叫的函式和呼叫流程。比如部落格中下面這張圖,很重要也很直觀的。

接下來我們開始分析**,看**的過程中,我們需要不斷回頭看看上面這張流程圖,方便對整個**進行理解剖析。

伺服器端**如下。

#include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define myport 8887

#define queue 20

#define buffer_size 1024

int main()

///listen,成功返回0,出錯返回-1

// 訊息佇列長度為20

if(listen(server_sockfd, queue) == -1)

///客戶端套接字

char buffer[buffer_size];

struct sockaddr_in client_addr;

socklen_t length = sizeof(client_addr);

///成功返回非負描述字,出錯返回-1

int conn = accept(server_sockfd, (struct sockaddr*)&client_addr, &length);

if(conn<0)

while(1)

close(conn);

close(server_sockfd);

return

0;}

**中,首先使用socket函式定義訊息使用ipv4網路,建立乙個面向連線的穩定資料傳輸,即tcp傳輸。

然後作者定義了乙個sockaddr_in結構體,用來存放伺服器的資訊。sockaddr_in中存放了客戶端的網路通訊方式——ipv4,tcp,以及監聽的ip位址。(這裡監聽的0.0.0.0,表示監聽本機上所有的ip位址,這裡的ip位址是指5層網路中的第4層網路層的ip位址,即伺服器端自身的ip位址,這部分資料可以參考【關於socket繫結inaddr_any】)。上面有比較詳細的解釋。

接下來呼叫bind函式繫結socket,同時呼叫listen開始監聽,使用accept接收訊息佇列中的訊息內容,監聽的ip和埠號已經在sockaddr_in中已經定義好了。

接著使用乙個while迴圈忙等待,等待呼叫recv讓服務端收到從其他客戶端發來的訊息。send表示將訊息傳送出去。

只要將服務端的**看懂,類似的,我們也能夠很簡單的看懂客戶端的**內容。請自行對著那張流程圖和**進行比對閱讀。

仔細檢視demo2使用tcp傳輸檔案的例子,其實和上乙個demo沒什麼本質上的區別,流程的關鍵**都一致。不過稍微注意的是,在這乙份demo中多了一行**。

setsockopt(server_socket_fd, sol_socket, so_reuseaddr, &opt, sizeof(opt));
到這裡其實想不出還有什麼需要在解釋的了,**很簡單,因為這兩份demo都很純粹,簡單幾行**便能夠展示清楚使用tcp變成的操作方法和順序(如果你想使用udp程式設計的話,方法類似)。

Socket程式設計小結(續)

1.重用已使用的位址 問題描述 在剛剛關閉了測試程式後,再啟動伺服器時提示bind失敗,返回錯誤eaddrinuse。原因分析 套接字 主動關閉一端 在關閉套接字後會停留在time wait狀態一端時間,由於我在同一機器上同時執行客戶端與伺服器,故伺服器在重新啟動執行bind時,可能上次關閉連線還沒...

socket程式設計

一直以為serversocket accept之後客戶端才能發資訊,實驗後得出如下結論 1 serversocket沒有accept時,client是可以傳送資訊到server端的。2 serversocket accept之後,正在處理訊息時,client也是可以傳送資訊到server端。如果se...

Socket程式設計

對tcp ip udp socket程式設計這些詞你不會很陌生吧?隨著網路技術的發展,這些詞充斥著我們的耳朵。那麼我想問 1.什麼是tcp ip udp?2.socket在 呢?3.socket是什麼呢?4.你會使用它們嗎?什麼是tcp ip udp?tcp ip transmission cont...