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)接收客戶請求;6.5.1 客戶端**(2)等待客戶請求到達該埠;
(3)接收到客戶端的服務請求時,處理該請求並傳送應答訊號。接收到併發服務請求,要啟用一新程序來處理這個客戶請求(如unix系統中用fork、exec)。新程序處理此客戶請求,並不需要對其它請求作出應答。服務完成後,關閉此新程序與客戶的通訊鏈路,並終止。
(4)返回第(2)步,等待另一客戶請求。
(5)關閉伺服器
dispatch_sync
(dispatch_get_global_queue(0
,0),
^);// [self test];
}
6.5.2 伺服器端**#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;
}
#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連線斷開,這...