網路位元組順序:
tcp/ip
採用16/32
位高位先存格式
tcp/ip
網路應用中,通訊的兩個程序主要採用
c/s模式。
伺服器要先啟動,並根據請求提供相應的服務:
1、開啟乙個通訊通道訂告知本地主機,它願意在某一位址和埠上接受客戶請求;
2、等待客戶請求到達該埠;
3、接受到重複服務請求,處理該請求並傳送應答訊號。接收到併發服務請求,要急活乙個新的程序(或執行緒)來處理這個客戶請求。服務完成後關閉此新程序與客戶的通訊鏈路並終止;
4、返回第二步,等待新的請求;
5關閉伺服器。
客戶方:
1、開啟乙個通訊通道,並連線到無**所在主機的特定埠;
2、想伺服器傳送請求報文,等待並接受應答,繼續提出請求。
3請求結束後青碧通道並終止。
套接字型別: 1、
流式套接字(
sock_stream):
基於tcp 2、
資料報套接字(
sock_dgram
):基於
udp
3、原始套接字(
sock_raw)
基於tcp
的socket
程式設計:
伺服器端: 1、
用socket
函式建立套接字 2、
將套接字繫結到乙個本地位址和埠上(
bind)
3、將套接字設為監聽模式,準備接受客戶請求(
listen);
4、等待客戶請求到來:當請求到來後接受連線請求,返回乙個新的對應此次連線的套接字(
accep)
5、用返回的套接字和客戶端進行通訊(
send/recv)
6、返回,等待另一客戶請求 7、
關閉套接字。
客戶端: 1、
建立套接字(
socket)
2、向伺服器傳送連線請求(
connect)
3、和伺服器進行通訊(
send/recv)
4、關閉套接字。 基於
udp的
socket程式設計
伺服器端: 1、
建立套接字(
socket)
2、將淘金誒子繫結到乙個本地位址和埠上(
bind)
3、等待接受資料(
recvfrom)
4、關閉套接字。
客戶端: 1、
建立套接字(
socke)
2、向務器傳送資料(
sendto)
3、關閉套接字。
具體事例講解:
首先載入
wsastartup
套接字型檔。
intwsastartup(
word wversionrequested,
lpwsadata lpwsadata);
載入完套接字型檔後需要建立套接字(
socket
)
socketsocket(
int af,//指定位址族,對與
tcp/ip
只能是af_inet
int type,//指定
socket
型別,對與
1.1版本,只支援
sock_stream
和sock_gram
int protocol//if 0,
自動選擇乙個合適的協議
);繫結本地位址和埠
intbind(
socket s,
const struct sockaddr* name,
int namelen
);
struct sockaddr_in ;
typedef struct in_addr s_un_b;struct s_un_w;
u_long s_addr;
} s_un
;
} in_addr;
u_longhtonl(
u_long hostlong);//
the htonl function converts a u_long from host to tcp/ip network byte order (which is big endian).
u_shorthtons(
u_short hostshort
);the htons function converts a u_short from host to tcp/ip network byte order (which is big-endian).
用
inet_addr()
函式將點分十進位制的
ip位址轉換成
u_long型別
用inet_ntoa()
完成相反的轉換
可以講ip位址指定為
inaddr_any,
允許套接字想任何分配給本地機器的
ip位址傳送資料
繫結完套接字後需要呼叫
listen
把套接字設定為監聽模式
intlisten(
socket s,
int backlog//等待連線佇列的最大值
);
然後等待連線請求的到來。
while(1
) ;
socketaccept(
socket s,
struct sockaddr* addr,//接受發起連線的客戶端位址
int* addrlen
);接受到客戶請求後就可以傳送資料了
intsend(
socket s,
const char* buf,
int len,
int flags
);傳送完資料後可以呼叫接受函式接收資料
intrecv(
socket s,
char* buf,
int len,
int flags
);在執行
winsocket
程式要包含
winsock2.h
需要連線
ws2_32.lib
庫檔案。
下面分析客戶端的程式:
首先也應建立套接字
socket
對於客戶端不需要繫結,直接連線伺服器端。
intconnect(
socket s,
const struct sockaddr* name,//要建立連線的位址資訊
int namelen
);在本地機器上可以用
127.0.0.1
,這是乙個迴路位址。
最後呼叫
closesocket() 和
wsacleanup
()。
udp的
socket
程式與tcp
基本類似。
建立套接字
socket
繫結套接字
bind 用
recvfrom
函式接受資料
intrecvfrom(
socket s,
char* buf,//用來接受資料
int len,//buf
長度
int flags,
struct sockaddr* from,//接收傳送資料方的位址資訊
int* fromlen
);
下面來看基於
udp的客戶端的程式:
首先建立套接字;
這裡不需要繫結,直接傳送資料。
intsendto(
socket s,
const char* buf,//傳送的資料
int len,//資料的長度
int flags,//它的值影響傳送資料的行為,一般設為
0
const struct sockaddr* to,//設定目的套接字的位址資訊
int tolen
);
C 網路程式設計之TCP UDP
最近因為需要用到網路程式設計的知識點,看了這篇部落格,感覺非常有用,對tcp udp描述的很通熟易懂 基於tcp協議的socket通訊類似於b s架構,面向連線,但不同的是伺服器端可以向客戶端主動推送訊息。使用tcp協議通訊需要具備以下幾個條件 1 建立乙個套接字 socket 2 繫結伺服器端ip...
unix網路程式設計之一TCP UDP
網路通訊中最常用的就是tcp udp。2種協議個有一些特點如下 udp是一種簡單的傳輸協議。應用程式寫資料到udp套介面。然後由它封裝成ipv4或ipv6的資料報,再傳送到目的位址。它不提供可靠性。它與伺服器不存在長期的連線關係。tcp是一種面向連線的協議。提供 可靠性 先連線,再傳輸資料。傳送資料...
java學習路程之網路程式設計 TCP UDP
public class demo01 1.tcp協議 tcp協議是面向連線的通訊協議,即在傳輸資料前先在傳送端和接收端建立邏輯連線,然後再傳輸資料,它提供了兩台計算機之間可靠無差錯的資料傳輸。在tcp連線中必須要明確客戶端與伺服器端,由客戶端向服務端發出連線請求,每次連線的建立都需要經過 三次握手...