搭建udp伺服器流程
⑴ UDP和Socket通信步驟
這是在網上找到的,希望對你有所幫助。
sockets(套接字)編程有三種,流式套接字(SOCK_STREAM),數據報套接字(SOCK_DGRAM),原始套接字(SOCK_RAW);
WINDOWS環境下TCP/UDP編程步驟:
1. 基於TCP的socket編程是採用的流式套接字。
在這個程序中,將兩個工程添加到一個工作區。要鏈接一個ws2_32.lib的庫文件。
伺服器端編程的步驟:
1:載入套接字型檔,創建套接字(WSAStartup()/socket());
2:綁定套接字到一個IP地址和一個埠上(bind());
3:將套接字設置為監聽模式等待連接請求(listen());
4:請求到來後,接受連接請求,返回一個新的對應於此次連接的套接字(accept());
5:用返回的套接字和客戶端進行通信(send()/recv());
6:返回,等待另一連接請求;
7:關閉套接字,關閉載入的套接字型檔(closesocket()/WSACleanup())。
伺服器端代碼如下:
#include <stdio.h>
#include <Winsock2.h>
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 1, 1 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
return;
}
if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 ) {
WSACleanup( );
return;
}
SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);
bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
listen(sockSrv,5);
SOCKADDR_IN addrClient;
int len=sizeof(SOCKADDR);
while(1)
{
SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);
char sendBuf[50];
sprintf(sendBuf,"Welcome %s to here!",inet_ntoa(addrClient.sin_addr));
send(sockConn,sendBuf,strlen(sendBuf)+1,0);
char recvBuf[50];
recv(sockConn,recvBuf,50,0);
printf("%s\n",recvBuf);
closesocket(sockConn);
}
}
客戶端編程的步驟:
1:載入套接字型檔,創建套接字(WSAStartup()/socket());
2:向伺服器發出連接請求(connect());
3:和伺服器端進行通信(send()/recv());
4:關閉套接字,關閉載入的套接字型檔(closesocket()/WSACleanup())。
客戶端的代碼如下:
#include <stdio.h>
#include <Winsock2.h>
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 1, 1 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
return;
}
if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 ) {
WSACleanup( );
return;
}
SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);
connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
char recvBuf[50];
recv(sockClient,recvBuf,50,0);
printf("%s\n",recvBuf);
send(sockClient,"hello",strlen("hello")+1,0);
closesocket(sockClient);
WSACleanup();
}
2.基於UDP的socket編程是採用的數據報套接字。
在這個程序中,將兩個工程添加到一個工作區。同時還要鏈接一個ws2_32.lib的庫文件。
伺服器端編程的步驟:
1:載入套接字型檔,創建套接字(WSAStartup()/socket());
2:綁定套接字到一個IP地址和一個埠上(bind());
3:等待和接收數據(sendto()/recvfrom());
4:關閉套接字,關閉載入的套接字型檔(closesocket()/WSACleanup())。
伺服器端代碼如下:
#include <winsock2.h>
#include <stdio.h>
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 1, 1 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 )
{
return;
}
if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 )
{
WSACleanup( );
return;
}
SOCKET sockSrv=socket(AF_INET,SOCK_DGRAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(7003);
bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
char recvBuf[50];
SOCKADDR addrClient;
int len=sizeof(SOCKADDR);
recvfrom(sockSrv,recvBuf,50,0,(SOCKADDR*)&addrClient,&len);
printf("%s\n",recvBuf);
closesocket(sockSrv);
WSACleanup();
}
對於基於UDP的socket客戶端來說,要進行如下步驟:
1:創建一個套接字(socket);
2:向伺服器發送數據(sendto);
3:關閉套接字;
代碼如下:
#include <winsock2.h>
#include <stdio.h>
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 2, 2 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
return;
}
if ( LOBYTE( wsaData.wVersion ) != 2 ||
HIBYTE( wsaData.wVersion ) != 2 ) {
WSACleanup( );
return;
}
SOCKET sockClient=socket(AF_INET,SOCK_DGRAM,0);
SOCKADDR_IN addrClient;
addrClient.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
addrClient.sin_family=AF_INET;
addrClient.sin_port=htons(8889);
SOCKADDR_IN addrSrv;
sendto(sockClient,"hi",3,0,(SOCKADDR*)&addrClient,sizeof(SOCKADDR));
}
LINUX環境下TCP/UDP編程步驟:
TCP編程步驟:
一. 服務端:
1.socket(int domain,int type,int protocol):建立套接字;
2 .bind(int sockid,struct sockaddr *addrp,socklen_t addrlen):把本機地址和埠跟上一步建立的socket綁定在一起;
3.listen(int sockid,int qsize):監聽某套接字;
4.fd=accept(int sockid,struct sockaddr *callerid,socklen_t *addrlenp):等待某套接字接收信息;
5.recv(int fd,void *buf,size_t nbytes,int flags):從套接字接收數據;
6.close(fd) 和close(sockid)
二.客戶端:
1. socket():建立套接字;
2.connect(int sockid,struct sockaddr *serv_addrp,socklen_t addrlen):連接到伺服器;
3. send(int sockfd,const void *buf,size_t nbytes,int flags):發送數據到伺服器.
4. close(sockid);
UDP編程步驟:
一,服務端:
1. socket():同上;
2. bind():同上;
3. recvfrom(int sockfd,void*buff,size_t nbytes,int flags,struct sockaddr*from,socklen_t*addrlen):在套接字口接收數據,並且記錄下接收到的數據來源;一定要注意這里的參數addrlen,它不僅是函數的輸出,也是函數的輸入!所以要在調用該函數之前對addrlen賦值sizeof(struct sockaddr)。否則返回的地址from將會出錯!
4. close(sockfd);
二. 客戶端:
1. socket();同上;
2. sendto(int sockfd,const void*buff,size_t nbytes,int flags,const struct sockaddr*to,socklen_t addrlen):往指定的地址發送數據;
3. close(sockfd);
⑵ c++編寫UDP客戶/伺服器程序,要求:使用udp服務實現客戶端與伺服器交互信息.
服務端與客戶端很大差異:
服務端接收多個客戶請示,客戶端只有一個客戶,
處理也不一樣。
你C++要選擇一個支持窗體的版本,如C++BUILDER,VC++等
⑶ 採用UDP協議進行通信的服務端和客戶端一個大致流程的偽代碼
起2個監聽線程分別綁2個埠
在來個線程池
ok
最好用MIna
nio之類的
⑷ 用java.net進行UDP編程伺服器端和客戶端的流程是怎樣的
伺服器端:
import java.io.*;
import java.net.*;
import java.applet.Applet;
public class TalkServer{
public static void main(String args[]) {
try{
ServerSocket server=null;
try{
server=new ServerSocket(4700);
}catch(Exception e) {
System.out.println("can not listen to:"+e);
}
Socket socket=null;
try{
socket=server.accept();
}catch(Exception e) {
System.out.println("Error."+e);
}
String line;
BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter os=new PrintWriter(socket.getOutputStream());
BufferedReader sin=new BufferedReader(new InputStreamReader(System.in));
System.out.println("Client:"+is.readLine());
line=sin.readLine();
while(!line.equals("bye")){
os.println(line);
os.flush();
System.out.println("Server:"+line);
System.out.println("Client:"+is.readLine());
line=sin.readLine();
}
os.close();
is.close();
socket.close();
server.close();
}catch(Exception e){
System.out.println("Error:"+e);
}
}
}
客戶端:
import java.io.*;
import java.net.*;
public class TalkClient {
public static void main(String args[]) {
try{
Socket socket=new Socket("127.0.0.1",4700);
BufferedReader sin=new BufferedReader(new InputStreamReader(System.in));
PrintWriter os=new PrintWriter(socket.getOutputStream());
BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream()));
String readline;
readline=sin.readLine(); //從系統標准輸入讀入一字元串
while(!readline.equals("bye")){
os.println(readline);
os.flush();
System.out.println("Client:"+readline);
System.out.println("Server:"+is.readLine());
readline=sin.readLine(); //從系統標准輸入讀入一字元串
}
os.close(); //關閉Socket輸出流
is.close(); //關閉Socket輸入流
socket.close(); //關閉Socket
}catch(Exception e) {
System.out.println("Error"+e); //出錯,則列印出錯信息
}
}
}
⑸ 用C#開發一個UDP伺服器
網上歷程有的是啊
無非就是
IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 10002);
Socket command_sock_query =new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
command_sock_query.Bind(ipep);
然後是發送和接收
command_sock_query.SendTo(sendbuf, sendbuf.Length, SocketFlags.None, remoteIpEndPoint);
int recv = command_sock_query.ReceiveFrom(recv_data, ref Remote);
但是伺服器一般會寫多線程。這就是UDP的一個弊端了。只有阻塞在接收介面了,一旦接收到數據就要開啟新的線程,會導致一個客戶端創建很多線程
建議TCP寫伺服器吧,在連接那監聽,創建新線程。
⑹ udp伺服器怎麼創建多個socket描述符
DP Server程序 1、編寫UDP Server程序的步驟 (1)使用socket()來建立一個UDP socket,第二個參數為SOCK_DGRAM。 (2)初始化sockaddr_in結構的變數,並賦值。sockaddr_in結構定義: struct sockaddr_in { uint8_t sin_len; sa_family_t sin_family
⑺ 1簡述使用WINSOCK編寫基於UDP通信的基本步驟
伺服器設置本地埠 然後綁定(bind)
客戶端設置remote的ip和port為伺服器的ip和port 本地埠設置可以省略 然後直接send信息
如果沒有設置錯的話應該就通了 然後伺服器那邊也可以send到客戶端
注意如果有NAT設備路由器的話要設置埠轉發
⑻ 如何在windows系統伺服器添加UDP埠
第一步:首先遠程登錄到伺服器, 登錄以後在運行裡面輸入gpedit.msc回車,依次展開 計算機配置--windows設置--安全設置 打開IP安全策略,然後找到allow udp,
第二步:依次雙擊allow udp 選擇許可的allow udp再進行雙線,然後選擇默認第一描述為allow udp的進行雙線,然後點擊添加點擊添加以後會提示下一步,點擊下一步後,描述裡面填寫udp描述,示例以1111為例然後點擊下一步,源地址選擇我的IP地址,目標地址選擇任何IP地址協議類型選擇udp協議埠選擇從此埠到任意埠然後確認保存,最後在防火牆裡面添加放行udp埠即可
windows2008系統策略開啟和windows2003一樣,只是防火牆端有一點不一樣,開始--管理工具--高級安全window防火牆然後右鍵入站規則--新建規則,規則類型選擇埠,然後下一步,埠類型選擇udp,埠選擇本地然後全部默認下一步,名稱就填寫udp名有些用戶的伺服器埠是在TCP/IP埠篩選裡面,如果是啟用的篩選,請注意在篩選裡面去操作。
⑼ 如何實現一個tcp/udp客戶端和伺服器,以及它們之間是如何交互
你先要了解一下網路協議。你這說的是傳輸層的協議,TCP和UDP都是固定埠的。網路分成好多層的,每層的埠都不一樣,每一層將會把低一層的數據封裝打包,這個就是所謂的協議,不同功能的軟體和硬體處理自己這層的埠和數據,然後再傳遞給上層。每一層協議不相關,也不需要知道和理解傳來的是什麼,只負責自己的規則就好,傳過來的都當成數據處理打包。RTSP是應用層的協議,在TCP和UDP之上層,可以自定義埠,一般是554。系統自己會處理TCP和UDP數據,socket都已經實現好了,然後再將RTSP的協議數據通過埠554給你客戶端。所以你不用太關心TCP和UDP層的東西,如果你發燒無聊,也可以自己實現TCP和UDP協議,抓取數據,得到RTSP的數據包,就是RTSP協議層部分了。獲取到RTSP的協議部分,通過RTSP的協議,分析出命令和數據部分,這個就是基本解析過程。