網路協議(二) Socket

2021-09-26 06:20:42 字數 4001 閱讀 4563

socket是為了實現以上的通訊過程而建立成來的通訊管道,其真實的代表是客戶端和伺服器端的乙個通訊程序,雙方程序通過socket進行通訊,而通訊的規則採用指定的協議。

socket只是一種連線模式,不是協議,socket是對tcp/ip協議的封裝,socket本身並不是協議,而是乙個呼叫介面(api),通過socket,我們才能使用tcp/ip協議。tcp、udp,簡單的說(雖然不準確)是兩個最基本的協議,很多其它協議都是基於這兩個協議如,http就是基於tcp的,.用socket可以建立tcp連線,也可以建立udp連線,這意味著,用socket可以建立任何協議的連線,因為其它協議都是基於此的。

優點缺點

socket

傳輸資料為位元組級,傳輸資料可自定義,資料量小(對於手機應用講:費用低)

需對傳輸的資料進行解析,轉化成應用級的資料

socket

傳輸資料時間短,效能高

對開發人員的開發水平要求高

socket

適合於客戶端和伺服器端之間資訊實時互動

相對於http協議傳輸,增加了開發量

socket

可以加密,資料安全性強

流程圖:

(1)開啟一通訊通道,並連線到伺服器所在主機的特定埠;

(2)向伺服器發服務請求報文,等待並接收應答;繼續提出請求…

(3)請求結束後關閉通訊通道並終止。

(1)開啟一通訊通道並告知本地主機,它願意在某一公認位址上的某埠(如ftp的埠可能為21)接收客戶請求;

(2)等待客戶請求到達該埠;

(3)接收到客戶端的服務請求時,處理該請求並傳送應答訊號。接收到併發服務請求,要啟用一新程序來處理這個客戶請求(如unix系統中用fork、exec)。新程序處理此客戶請求,並不需要對其它請求作出應答。服務完成後,關閉此新程序與客戶的通訊鏈路,並終止。

(4)返回第(2)步,等待另一客戶請求。

(5)關閉伺服器

6.5.1 客戶端**
dispatch_sync

(dispatch_get_global_queue(0

,0),

^);// [self test];

}

#include

#include

#include

#include

#include

#include

#include

#define buffer_size 1024

intmain

(int argc,

const

char

* ar**)

char recv_msg[buffer_size]

;char input_msg[buffer_size];if

(connect

(server_sock_fd,

(struct sockaddr *

)&server_addr,

sizeof

(struct sockaddr_in))==

0)}if

(fd_isset

(server_sock_fd,

&client_fd_set))

recv_msg[byte_num]

='\0'

;printf

("伺服器:%s\n"

, recv_msg);}

else

if(byte_num <0)

else}}

//}

}return0;

}

6.5.2 伺服器端**
#include  

#include

#include

in.h>

#include

#include

#include

#include

#define backlog

5//完成三次握手但沒有accept的佇列的長度

#define concurrent_max

8//應用層同時可以處理的連線

#define server_port

11332

#define buffer_size

1024

#define quit_cmd

".quit"

int client_fds[

concurrent_max

];

int main

(int argc, const char * ar**)

//繫結socket

int bind_result =

bind

(server_sock_fd,

(struct sockaddr *

)&server_addr,

sizeof

(server_addr));

if(bind_result ==-1

)//listen if(

listen

(server_sock_fd,

backlog)==

-1)//fd_set

fd_set server_fd_set;

int max_fd =-1

;struct timeval tv;

//超時時間設定

while(1

)//printf("stdin_fileno=%d\n", stdin_fileno);

//伺服器端socket

fd_set

(server_sock_fd,

&server_fd_set)

;// printf("server_sock_fd=%d\n", server_sock_fd);

if(max_fd < server_sock_fd)

//客戶端連線

for(int i =

0; i <

concurrent_max

; i++)}

} int ret =

select

(max_fd +1,

&server_fd_set,

null

,null

,&tv);if

(ret <0)

else

if(ret ==0)

else

for(int i =

0; i <

concurrent_max

; i++)}

}if(fd_isset

(server_sock_fd,

&server_fd_set))}

if(index >=0)

else}}

for(int i =

0; i <

concurrent_max

; i++)

recv_msg[byte_num]

='\0'

;printf

("客戶端(%d):%s\n"

, i, recv_msg);}

else

if(byte_num <0)

else}}

}}}return0;

}

網路協議及socket

實體層 就是把電腦連線起來的物理手段。它主要規定了網路的一些電氣特性,作用是負責傳送0和1的電訊號。分組方式 乙太網協議 一組電訊號構成乙個資料報,叫做 幀 frame 每一幀分成兩個部分 標頭 head 和資料 data mac位址 乙太網資料報的 標頭 包含了傳送者和接受者的資訊 資料報必須是從...

網路協議 傳輸層協議 Socket程式設計

套接字底層原理使用 tcp 或 udp 時,又會廣泛使用到 socket 套接字 api,socket 原本是由 bsd unix 開發的,但是後來被移植到 windows 的 winsock 以及嵌入式系統中。應用程式利用 socket,可以設定對端的 ip 位址 埠號,並實現資料的接收和傳送 下...

網路協議(二)

tcp協議對應於傳輸層,而http協議對應於應用層,從本質上來說,二者沒有可比性。http協議是建立在tcp協議基礎之上的,當瀏覽器需要從伺服器獲取網頁資料的時候,會發出一次http請求。http會通過tcp建立起乙個到伺服器的連線通道,當本次請求需要的資料完畢後,http會立即將tcp連線斷開,這...