udp和tcp的對比--udp處理的細節比tcp少。
--udp不能保證訊息被傳送到目的地。
--udp不能保證資料報的傳遞順序。
--tcp處理udp不處理的細節。
--tcp是面向連線的協議
--udp是無連線協議
--tcp保持乙個連線
--udp只是把資料傳送出去而已
tcp的優點--tcp提供以認可的方式顯示的建立連線和終止連線。
--tcp保證可靠的,順序的以及不會重複的資料傳輸。
--tcp處理流控制。
--tcp允許資料優先。
--如果資料沒有傳送到,tcp套接字會返回出錯提示。
--tcp通過保持連線並將資料塊分成更小的分片來處理大資料,而無需程式設計師編碼處理。
tcp的缺點
--tcp需要建立並保持乙個連線,給系統帶來很大開銷。
--tcp資料傳輸效率低。
併發機制1.增加server數量
2.多層結構
一台server同事支援1000個client
中介軟體對於普通使用者來講是server,對於server是client,乙個中介軟體同時支援1000個client
中介軟體會遍歷自己管理的1000個client,發現client需要連線server,才會將請求傳送給server,不需要連線server的client就不向server傳送請求
多層結構的原理:利用不是client在同一時間內都需要向server傳送請求,永遠只有部分使用者需要傳送請求。
udp的優點--udp不要求保持乙個連線
--udp沒有因接收方沒有收到資料報重傳而帶來開銷。
--設計udp目的是用於短應用和控制訊息。
--在乙個資料報接乙個資料報基礎上,udp要求的網路頻寬比tcp小。
udp的缺點
--程式設計師必須建立**監測資料報的正確性,必要時重傳。
--程式設計師必須把大資料報分片。
選擇使用哪一種協議?--一些訊息重要程度不高,或者有規律重複,可以使用udp。
--如果要傳輸乙個重要的資料,丟失一點就會破壞整個資料,那麼需要選擇tcp。
--telnet,ssh,http等基本都基於tcp。
--流**為了保證很窄的網路頻寬來傳送更多的資料,基本採用udp。
多數遊戲中,丟失來自某個使用者的狀態更新可能不會引起注意,所以採用udp。
設計用在區域網的應用可以採用udp,因為在區域網中丟失資料報的可能性很低。
使用udp與tcp所用的**基本類似,唯一的區別在於socket函式呼叫的時候的乙個引數不同int socket(int domain,int type,int
protocol);
引數type為sock_stream代表tcp,sock_dgram代表udp。
對於tcp和udp都可以使用recvfrom函式,但recv只能tcp使用。
使用udp傳送資料。ssize_t sendto(
int s,const
void *buf,size_t len,int flags,const
struct sockaddr *to,socklen_t tolen);
引數s是指套接字描述符
引數buf是傳送資料buf記憶體位址指標
引數len是傳送資料的長度
引數flags一般傳0
引數to是結構sockaddr的記憶體位址指標
引數tolen是結構sockaddr的大小
udp不需要握手機制,也不需要確認另乙個系統是否有服務端在listen。
成功返回傳送的位元組數,失敗返回-1,並且設定errno
使用udp接收資料ssize_t recvfrom(
int s,void * buf,size_t blen,int flags,struct sockaddr * from
,socklen_t * fromlen);
成功返回接收位元組數,失敗返回-1,並且設定errno;udp不同於tcp/ip,就算傳送端關閉,recvfrom也不會返回0,因為udp是無連線協議。
udp不需要listen,bind之後就可以接受資料了。
recv函式只是從udp快取中讀資料(此時資料已經在自己的電腦上了),不是直接從網路中讀資料,什麼時候udp快取區滿了,另一邊的send函式才會停止傳送資料。
udp傳送廣播訊息ip位址由四個位元組組成,每個位元組十進位制是0時,表示本機,十進位制是255就是廣播訊息,
例如:192.168.1.255這就是在 192.168.1
.x這個區域網中廣播訊息
但是255.
255.255
.255並無法在全世界廣播訊息,因為路由器會遮蔽區域網中廣播訊息,不會傳遞到公網上。
**如下
int on = 1
;if (setsockopt(st, sol_socket, so_broadcast, &on, sizeof(on)) == -1
)
sendto和recvform在udp中,當udp接收端,只要bind埠號,sendto傳送的資料就會快取到接收端的udp快取區中,如果快取區已滿,那麼sendto函式便會報錯(資訊過長錯誤)。
將網域名稱轉化為ip位址const
char *getipaddrbvhostname(const
char *hostname)
;
struct hostent *h;
h=gethostbyname(hostname);
strcpy(s,inet_ntoa(*((struct in_addr *)h->h_addr)));
return
s;}
將struct sockaddr_in轉化為ip位址const
char *getipaddrbvaddr(struct sockaddr_in *client_addr)
void sockaddr_toa(const
struct sockaddr_in *addr,char *ipaddr)
inet_ntoa()函式是乙個執行緒不安全函式,這個函式返回的是字串,
獲取socket自身的sockaddrint getsockname(int sockfd,struct sockaddr *addr,socklen_t *addrlen);
獲取socket連線的遠端sockaddr
int getpeername(int sockfd,struct sockaddr *addr,socklen_t *addrlen);
網路程式設計 UDP協議
udp協議 服務端1 2 udp 協議 又稱 資料報協議 sock dgram34 5 from socket import 一般不這樣做 會重名 但寫socket可以這樣寫 因為要用到太多 會有大量的socket.67 server socket af inet,sock dgram 8 serv...
網路程式設計之UDP協議
將資料及源和目的封裝成資料報,不需要建立連線。每個資料報的大小限制在64k內。因無連線,是不可靠的協議,但是速度快。客戶端 1 建立udp傳輸的傳送端 2 建立udp的socket服務 3 將要傳送的資料封裝到資料報中 4 通過udp的socket服務獎資料報傳送過去 5 關閉socket服務 pu...
網路程式設計之UDP協議
1 實現的功能 能夠傳送和接收訊息,並且在發生886後退出 2 chatroom 類 public class chatroom 3 傳送執行緒sendthread 類public class sendthread implements runnable override public void r...