Linux Socket程式設計的一些總結

2021-09-06 10:19:53 字數 2356 閱讀 4480

最近寫了一些linux下網路程式設計的一些程式,做幾點總結吧。

先給出客戶端後伺服器的一些socket初始化的**,以後可以直接拿來呼叫。

客戶端socket初始化**

#include #include #include #include #include #include #include #include #include #include #include #include #include #define ip "192.168.1.111"

#define port 12346

int init_socket()

//設定伺服器端的位址,埠等

server_addr.sin_family=af_inet;

server_addr.sin_addr.s_addr=inet_addr(ip);//字串型別轉ip型別

server_addr.sin_port=htons(port);

bzero(&(server_addr.sin_zero),8);

connect(client_socket,(struct sockaddr *)&server_addr,sizeof(struct sockaddr));//連線伺服器

return client_socket;

}

直接呼叫上面的函式返回乙個套接字的檔案描述符,利用它便可以和伺服器進行通訊。

下面給出伺服器socket初始化的**

#include #include #include #include #include #include #include #include #include #include #include #include #include #define port 12346

#define backlog 20

int init_server_socket()

//設定伺服器端的位址,埠等

server_addr.sin_family = af_inet;

server_addr.sin_port = htons(port);

server_addr.sin_addr.s_addr = htons(inaddr_any);

bzero(&(server_addr.sin_zero), 8);

//將建立的套接字繫結到伺服器端

err = bind(server_socket, (struct sockaddr *)&server_addr, sizeof(struct sockaddr));

if(err<0)

//監聽套接字

err=listen(server_socket,backlog);

if(err<0)

return server_socket;

}

上面的初始化函式返回了乙個套接字檔案描述符,我們在伺服器程式中,可以寫乙個迴圈,當有客戶端連線請求的時候,伺服器就建立乙個執行緒和伺服器進行通訊。**如下所示:

while(1)

要點總結:

1、在伺服器端程式要判斷recv()函式的返回值,如果對方傳送的資料比較的則需採用迴圈接收的方法,比如對方一次發了4096位元組的資料,一次rrecv()可能接收不了,則需要多次接收,直到接收的總數等於4096位元組,看下面的**你就會明白

#define maxbuffer_size 4096

int total_reieved =0;

char recvbuffer[maxbuffer_size];

while(1)

2、如果傳送方的程式關閉了,在接收方就會不斷recv()並返回0,則我們就要關閉這個連線,防止接收方陷入死迴圈

3、拔網線拔掉重新插上,socket可以自動恢復連線

4、預設的連線時阻塞模式的,如果要將套接字通訊設定成非阻塞模式我們可以參考下面的**(對套接字檔案描述符設定),非阻塞模式下如果讀不到資料則返回-1,網路斷開也是返回-1

int flags = fcntl(server_client_socket, f_getfl, 0);

fcntl(server_client_socket, f_setfl, flags | o_nonblock);

5、假如客戶端程式一直傳送資料,伺服器程式一直接受資料,這時伺服器程式關閉,則客戶端程式也會關閉,這時因為伺服器close乙個連線時,若客戶端接這發資料,系統會產生乙個sigpipe訊號,告訴程序連線已經斷開了,而處理這個訊號的預設動作是使程序退出,如果不想程序退出,可以把sigpipe設為sig_ign。呼叫函式signal(sigpipe,sig_ign);

大概就總結了這幾點,歡迎批評和指正。

linux socket 程式設計

兩段程式 可用於開發板和主機之間的資料傳輸,很管用!file client.c檔案傳輸客戶端程式示例 本檔案是客戶機的 include for sockaddr in include for socket include for socket include for printf include f...

linux socket程式設計

雙休日無聊透頂,看了四五集 反恐24小時 實在不想看了,於是就想搞linux的socket programming來玩玩,前期資料都準備好 早就想寫個看看了。首先,寫個簡單的client端的程式 呵,其實是copy!server端用的是網上當的乙個除錯工具 一開始用的是以前用過的乙個多執行緒執行的介...

Linux Socket程式設計 執行緒

本章主要列舉伺服器程式的各種網路模型,示例程式以及效能對比後面再寫。一 分類依據。伺服器的網路模型分類主要依據以下幾點 1 是否阻塞方式處理請求,是否多路復用,使用哪種多路復用函式 2 是否多執行緒,多執行緒間如何組織 3 是否多程序,多程序的切入點一般都是accept函式前 二 分類。首先根據是否...