【windows socket+UDP伺服器客戶端】
Windows Socket+UDP伺服器客戶端
Winsock是 Windows下套接字標準。
1.UDP socket程式設計:
UDP(使用者資料包協議)是一個無連線,不可靠的資料傳輸,其特點是簡單,快捷。相比與TCP,UDP不需要建立連線(不需connect、accept函式),資料傳送接收之後,不需要終止連線。基於UDP的程式,避免了TCP執行的開銷,在效率與速度上具有更好的表現。
UDP是無連線的,可能會有資料的丟失,延遲,這些需要應用程式自己處理。
2.UDP基本函式:
建立socket:
SOCKET socket (int af, int type, int protocol);
第一個引數af: 表示族地址,網路程式設計一般使用AF_INET巨集。
第二個引數type: 表示連線型別,TCP可選面向連線SOCK_STREAM,UDP資料包SOCK_DGRAM。
第三個引數protocol: 表示協議,在使用AF_INET族地址UDP連線,設為IPPROTO_UDP。
繫結socket:
int bind(SOCKET s, const struct sockaddr *saddr,int namelen);
第一個引數: 需要繫結的socket。
第二個引數: 對應AF_INET,使用struct sockaddr_in包含協議,IP,埠等資訊。
第三個引數: 對應AF_INET,使用struct sockaddr_in結構大小。
該函式將socket與協議,IP地址,Port埠號繫結起來,相對於給socket“命名”唯一的標識,這樣其他的程式就可以通過這個標識找到這個socket。
傳送資料:
int sendto(SOCKET s, const char
*buf, int len,
int flags, const struct sockaddr *to, int tolen);
第一個引數: socket為對方的socket。
第二個引數: 傳送資料的緩衝區。
第三個引數: 資料緩衝區大小。
第四個引數: 緊急狀態,一般這為0。
第五個引數: 可選,對應AF_INET,對方IP,埠等socket地址標識sockaddr_in。
第六個引數: 可選,對應AF_INET,使用sockaddr_in結構大小。
該函式用於UDP傳送資料。
接收資料:
int recvfrom(SOCKET s, char
*buf, int len,
int flags, struct sockaddr *from, int *fromlen );
第一個引數: socket為對方的socket。
第二個引數: 接收資料的緩衝區。
第三個引數: 資料緩衝區大小。
第四個引數: 緊急狀態,一般這為0。
第五個引數: 可選,對應AF_INET,返回對方IP,埠等socket地址標識sockaddr_in。
第六個引數: 可選,對應AF_INET,使用sockaddr_in結構大小。
該函式用於UDP接收資料。
繫結socket:
int bind(SOCKET s, const struct sockaddr *saddr,int namelen);
第一個引數: 需要繫結的socket。
第二個引數: 對應AF_INET,使用struct sockaddr_in包含協議,IP,埠等資訊。
第三個引數: 對應AF_INET,使用struct sockaddr_in結構大小。
該函式將socket與協議,IP,埠號繫結起來,相對於給socket“命名”唯一的標識,這樣其他的程式就可以通過這個標識找到這個socket。
關閉套接字:
int closesocket(SOCKET s);
引數為socket。
該函式用於關閉套接字。
3.牛刀小試:
先在VC6.0執行伺服器程式,再開啟一個VC6.0執行客戶端程式:
UDPsever伺服器等待來自客戶端的資訊,收到資訊後列印出來,然後向客戶端傳送現在的時間。
UDPclient客戶端向伺服器傳送一個“Hello,server!”資訊,然後接收來自伺服器的時間資訊並列印,重複三次。
執行效果:
UDP客戶端程式:
#include
#include
#pragma comment(lib,"ws2_32.lib")
int main()
{
WSADATA wsa;
SOCKET serversoc;
SOCKADDR_IN serveraddr;
SOCKADDR_IN peeraddr;
int peer_len=sizeof(peeraddr);
char Recv_buf[64];
//char *Server_IP="127.0.0.1";
char *Send_data="Hello,server!";
int Send_len=strlen(Send_data);
int time_out=2000; //接收超時
int result;
WSAStartup(WINSOCK_VERSION,&wsa); //初始化WS2_32.DLL
//命名協議,IP,埠
serveraddr.sin_family = AF_INET;
serveraddr.sin_port = htons(13);
serveraddr.sin_addr.s_addr = inet_addr("127.0.0.1");
if(serveraddr.sin_addr.s_addr==INADDR_NONE)
{
printf("不可用地址!\n");
return -1;
}
//建立套接字
serversoc = socket(AF_INET,SOCK_DGRAM,0);
result = setsockopt(serversoc,SOL_SOCKET,SO_RCVTIMEO,(char*)&time_out,sizeof(time_out));
for(int i=0;i<3;i++)
{
//傳送資料
result = sendto(serversoc,Send_data,Send_len,0,(SOCKADDR *)&serveraddr,sizeof(serveraddr));
//接收資料
result = recvfrom(serversoc,Recv_buf,64,0,(SOCKADDR *)&peeraddr,&peer_len);
if(result >= 0)
{
Recv_buf[result]= 0;
printf("接收資料為: %s \n",Recv_buf);
}
}
closesocket(serversoc);
WSACleanup();
return 0;
}
UDP伺服器程式:
#include
#include
#include
#pragma comment(lib,"ws2_32.lib")
int main()
{
WSADATA wsa;
WSAStartup(WINSOCK_VERSION,&wsa); //初始化WS2_32.DLL
SOCKET serversoc;
SOCKET clientsoc;
SOCKADDR_IN serveraddr;
SOCKADDR_IN clientaddr;
int client_len = sizeof(clientaddr);
int server_len = sizeof(serveraddr);
char *Send_data;
int Send_len;
char Recv_buf[64];
int result;
time_t nowtime;
//命名協議,IP,埠
serveraddr.sin_family = AF_INET;
serveraddr.sin_port = htons(13);
serveraddr.sin_addr.s_addr = INADDR_ANY;
//建立socket
serversoc = socket(AF_INET,SOCK_DGRAM,0);
//繫結socket
result=bind(serversoc, (SOCKADDR *)&serveraddr, server_len);
if(result==SOCKET_ERROR)
{
printf("套接字繫結失敗!\n");
closesocket(serversoc);
return -1;
}
printf("Server is running.....\n");
clientsoc = socket(AF_INET,SOCK_DGRAM,0);
while(1)
{
//接收資料
result = recvfrom(serversoc,Recv_buf,64,0,(SOCKADDR *)&clientaddr,&client_len);
if(result >= 0)
{
Recv_buf[result]= 0;
printf("接收資料為: %s \n",Recv_buf);
//傳送資料
nowtime=time(0);
Send_data=ctime(&nowtime);
Send_len=strlen(Send_data);
result = sendto(clientsoc,Send_data,Send_len,0,(SOCKADDR *)&clientaddr,sizeof(clientaddr));
printf("Server is running.....\n");
}
}
closesocket(serversoc);
WSACleanup();
return 0;
}
相關文章
- 【windows socket+TCP伺服器客戶端】WindowsTCP伺服器客戶端
- 【windows socket+HTTP伺服器客戶端】WindowsHTTP伺服器客戶端
- VNC客戶端是Windows,VNC客戶端是Windows如何進行操作VNC客戶端Windows
- vnc windows客戶端,vnc windows客戶端下載,具體使用教程。VNCWindows客戶端
- VNC客戶端推薦,Windows系統下VNC客戶端推薦VNC客戶端Windows
- Windows下安裝redis客戶端WindowsRedis客戶端
- 小弟求救伺服器-客戶端程式伺服器客戶端
- windows 上rsync客戶端使用方法Windows客戶端
- GitHub Windows客戶端無法登入GithubWindows客戶端
- 客戶端(windows)訪問FTP伺服器遇到的問題(總結)客戶端WindowsFTP伺服器
- Windows客戶端的JProfiler遠端監控Linux上的Tomcat伺服器Windows客戶端LinuxTomcat伺服器
- MQTT伺服器搭建服務端和客戶端MQQT伺服器服務端客戶端
- oracle 客戶端與伺服器端的關係Oracle客戶端伺服器
- js 客戶端與伺服器端的通訊JS客戶端伺服器
- 客戶端 post ,get 訪問伺服器客戶端伺服器
- Redis從客戶端登入伺服器Redis客戶端伺服器
- Oracle客戶端連線伺服器教程Oracle客戶端伺服器
- windows tftp客戶端,5步掌握win7開啟tftp客戶端的方法教程WindowsFTP客戶端Win7
- windows7下安裝oracle客戶端WindowsOracle客戶端
- 客戶端到伺服器端的通訊過程客戶端伺服器
- Redis原始碼剖析——客戶端和伺服器Redis原始碼客戶端伺服器
- 伺服器獲取真實客戶端 IP伺服器客戶端
- 使用 WebSocket 客戶端連線 MQTT 伺服器Web客戶端MQQT伺服器
- 客戶端怎麼連線到伺服器?客戶端伺服器
- redis伺服器/客戶端安裝與配置Redis伺服器客戶端
- 【轉載】MySQL客戶端伺服器協議MySql客戶端伺服器協議
- 客戶端Ping伺服器工具[Python]客戶端伺服器Python
- Easyvision中的伺服器與客戶端伺服器客戶端
- SseEmitter 伺服器向客戶端推送訊息MIT伺服器客戶端
- Thrift安裝與伺服器、客戶端的編寫執行演示(windows版本)伺服器客戶端Windows
- IT 團隊文件工具 showdoc 推出 Windows 版客戶端Windows客戶端
- 實戰:Windows防火牆保護客戶端安全Windows防火牆客戶端
- WINDOWS8.1安裝ORACLE客戶端及配置WindowsOracle客戶端
- Nagios 監控windows客戶端安裝教程iOSWindows客戶端
- windows bilibili客戶端快取影片匯出Windows客戶端快取
- dubbo客戶端客戶端
- Pulsar客戶端客戶端
- mqtt 客戶端MQQT客戶端