上次說的是基於tcp的協議的
socket
程式設計,tcp
協議是基於面向連線的可靠通訊協議,它具有重發機制,也即當資料被破壞或者丟失的時候,傳送方可以將該資料重發。而在資料傳輸層當中還有一種協議不具備這種重發機制——
udp協議。
udp協議是基於使用者資料報協議,比如說當使用者使用
udp協議傳送了一條訊息時,並不知道該訊息是否已經到達接收方,或者這個訊息已經在傳送的過程中丟失,所以它屬於不可靠連線通訊的協議。但是在即時通訊中,
udp協議在對一些對時間要求較高的網路資料傳輸方面有著重要的作用。
由此,在基於udp
的soocket
程式設計中,當程式建立套接字控制代碼成功以後,便可以直接呼叫函式進行資料的收發,最後關閉套接字物件。在整個過程中,程式都不用呼叫任何函式連線伺服器或者接受客戶端的連線事件的操作。在
udp中進行資料收發的函式是
sendto()
和recvfrom();
sendto()的函式原型如下:
sendto(
socket s,//套接字控制代碼
const char far * buf,//資料緩衝區
int len,//資料的長度
int flags,//一般設定為
0const struct sockaddr far * to,//目標位址結構資訊
int tolen//目標位址結構大小);
recvfrom()函式原型如下:
recvfrom(
socket s,
char far * buf,
int len,
int flags,
struct sockaddr far * from,//指向位址結構
sockaddr_in
的指標,表示資料傳送方的位址資訊
int far * fromlen//上位址結構的大小);
同樣,建立伺服器端:
#include //包含標頭檔案
#include #include #pragma comment(lib,"ws2_32.lib");//顯示連線套接字型檔
int main()
; addr.sin_family=af_inet;//初始化位址結構
addr.sin_port=htons(75);
addr.sin_addr.s_un.s_addr=inaddr_any;
::bind(s,(sockaddr*)&addr,sizeof(addr));//繫結套接字
printf("udp伺服器已經啟動.....\r\n");
if(::recvfrom(s,buff,10,0,(sockaddr*)&addr2,&n)!=-1)//接受客戶端資訊
else
}return 0;
}
建立客戶端:
#include //包含標頭檔案
#include #include #pragma comment(lib,"ws2_32.lib");//顯示連線套接字型檔
int main()
; addr.sin_family=af_inet;//初始化位址結構
addr.sin_port=htons(75);
addr.sin_addr.s_un.s_addr=inet_addr("127.0.0.1");
printf("udp客戶端已經啟動...\r\n");
if(::sendto(s,buff,sizeof(buff),0,(sockaddr*)&addr,n)!=0)//傳送資訊
else
}return 0;
}
linux socket網路程式設計之socket屬性
1.函式用法 include include int getsockopt int sockfd,int level,int optname,void optval,socklen t optlen 函式用於獲得某個套接字的屬性 int setsockopt int sockfd,int level...
初識網路協議 基於TCP和UDP的Socket程式設計
在建立socket的時候,socket函式需要指定是ipv4還是ipv6,分別對應af inet和af inet6,這是網路層的。其次,還需指定是tcp還是udp,這是傳輸層的。tcp是基於資料流的,所以設定為sock stream,udp是基於資料報的,所以設定為sock dgram。基於tcp協...
python網路程式設計之基於udp的簡易聊天室實現
為了讓兩個程式通過網路進行通訊,二者必須使用socket套接字 udp是面向訊息的協議,通訊時不需要建立連線,因此比較靈活,同時傳輸也是不可靠的。udp通訊模型如下 udp client.py 如下 import socket 匯入socket模組 s socket.socket socket.af...