Linux的socket通訊(TCP可靠性傳輸)

2021-10-06 04:12:26 字數 3813 閱讀 3757

1.建立socket物件

#include

#include

intsocket

(int domain,

int type,

int protocol)

;

domain用來指定使用的域,這裡使用tcp/ip協議,af_inet表示ipv4協議,af_inet6為ipv6協議;type指定資料傳輸方式,有兩種:①sock_stream代表面向連線的資料流方式,sock_dgram代表無連線的資料報方式。protocol一般為0.

建立成功返回socket控制代碼值,失敗返回-1。

2.伺服器端

①繫結埠

int

bind

(int sockfd,

struct sockaddr *my_addr,socklen_t addrlen)

;

伺服器要繫結埠。sockfd是繫結的socket控制代碼;my_addr指向sockaddr結構體,裡面用來儲存ip號和埠號;addrlen是sockaddr的結構大小。繫結成功返回0,失敗返回-1。

②監聽連線

int

listen

(int s,

int backlog)

;

伺服器繫結埠後要監聽。s是要監聽的socket控制代碼,backlog引數指定最多監聽連線數,最多20個。成功返回0,失敗返回-1。

③接收請求

int

accept

(int s,

struct sockaddr *addr,socklen_t *addrlen)

;

伺服器監聽的時候負責接收來自客戶端請求。accept()函式會獲得連線資訊,穿件新的套接字,並返回套接字的描述符。成功套接字的描述符,失敗返回-1。

3.客戶端

①建立連線

int

connect

(int sockfd,

const

struct sockaddr *serv_addr,socklen_t addrlen)

;

用於連線伺服器端。sockfd是套接字控制代碼;serv_addr指向sockaddr結構,指定伺服器的ip位址和埠號;addrlen是sockaddr的長度。

4.傳送和接收操作

伺服器端和客戶端都能用到。

ssize_t send

(int s,

const

void

*buf,size_t len,

int flags)

;ssize_t recv

(int s,

void

*buf,size_t len,

int flags)

;

s是套接字控制代碼,buf是存放資料緩衝首位址,len引數是緩衝資料大小,flag預設為0.

4.例項

伺服器端**

#include

#include

#include

#include

#include

#include

#include

#include

#define ehco_port 8080

#define max_client_num 10

intmain()

else

//設定server位址結構

bzero

(&serv_addr,

sizeof

(serv_addr));

//初始化結構占用記憶體

serv_addr.sin_family=af_inet;

//設定傳輸層型別ipv4

serv_addr.sin_port=

htons

(ehco_port)

;//設定埠號

serv_addr.sin_addr.s_addr=

htons

(inaddr_any)

;//設定伺服器ip位址

bzero(&

(serv_addr.sin_zero),8

);//繫結埠if(

bind

(sock_fd,

(struct sockaddr*

)&serv_addr,

sizeof

(serv_addr))!=

0)else

//監聽埠if(

listen

(sock_fd,max_client_num!=0)

)else

//建立連線客戶端的對應套接字

len=

sizeof

(client_add)

; client_fd=

accept

(sock_fd,

(struct sockaddr*

)&client_add,

&len);if

(client_fd<=0)

//接收客戶端發來的資料

while

((n=

recv

(client_fd,buff,

100,0)

)>0)

}close

(client_fd)

;close

(sock_fd)

;return0;

}

客戶端**

#include

#include

#include

#include

#include

#include

#include

#include

#define ehco_port 8080

intmain()

else

//設定server位址結構

bzero

(&serv_addr,

sizeof

(serv_addr));

//初始化結構占用記憶體

serv_addr.sin_family=af_inet;

//設定傳輸層型別ipv4

serv_addr.sin_port=

htons

(ehco_port)

;//設定埠號

serv_addr.sin_addr.s_addr=

inet_addr

("192.168.31.101");

//設定伺服器ip位址

bzero(&

(serv_addr.sin_zero),8

);//連線服務端if(

-1==connect

(sock_fd,

(struct sockaddr*

)&serv_addr,

sizeof

(serv_addr)))

printf

("success connect to server!\n");

//傳送並接收緩衝的資料

while(1

)}close

(sock_fd)

;return0;

}

這裡只有客戶端傳送,服務端接收並返回資訊,客戶端再接收。

用多執行緒可以實現伺服器與客戶端收發控制。

Linux學習 通訊 Socket封裝

1.進行標頭檔案的編寫 將server.c中的socket函式和client.c中的socket函式封裝進去標頭檔案,這樣就可以直接在服務端或客戶端直接進行呼叫,不需要每次都編寫socket函式。1.1 對server.c進行修改。include include see notes include ...

Linux下面socket程式設計的非阻塞TCP研究

tcp協議本身是可靠的,並不等於應用程式用tcp傳送資料就一定是可靠的.不管是否阻塞,send傳送的大小,並不代表對端recv到多少的資料。在阻塞模式下,send函式的過程是將應用程式請求傳送的資料拷貝到傳送快取中傳送並得到確認後再返回.但由於傳送快取的存在,表現為 如果傳送快取大小比請求傳送的大小...

Linux下面socket程式設計的非阻塞TCP研究

tcp協議本身是可靠的,並不等於應用程式用tcp傳送資料就一定是可靠的.不管是否阻塞,send傳送的大小,並不代表對端recv到多少的資料.在阻塞模式下,send函式的過程是將應用程式請求傳送的資料拷貝到傳送快取中傳送並得到確認後再返回.但由於傳送快取的存在,表現為 如果傳送快取大小比請求傳送的大 ...