c#udp源端口目的端口不同

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c#udp源端口目的端口不同相关的知识,希望对你有一定的参考价值。

在unity中使用UDP进行数据的交互,建立C/S模式,两个客户端和一个服务端。两个客户端使用不同的端口往服务端发送数据,服务端根据收到的数据进行处理和判断,控制服务端的显示。

说明:两个客户端连接的是Kinect V2,需要将检测到的人体的数据信息发送到服务端进行系统数据的整体显示。指定的消息协议是ClientID|index|PosLeft|Left_S|PosRight|Right_S|ACTION| ClientID|index|PosLeft|Left_S|PosRight|Right_S|ACTION| ...

这是客户端根据检测到人体的数量向服务端发送的数据格式。

服务端:使用两个线程用于接收两个客户端的数据,将收到的数据添加到Queue中。在需要显示数据的Update中从Queue中取出数据进行处理控制。

这里服务端的接收数据脚本直接上代码:

using UnityEngine;
using System.Collections;
//引入库
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Collections.Generic;

public class UdpHelpHandler : MonoBehaviour

//以下默认都是私有的成员
Socket socket,socket2; //目标socket
EndPoint clientEnd; //客户端
IPEndPoint ipEnd,ipEnd2; //侦听端口
string recvStr,recvStr2; //接收的字符串
string sendStr; //发送的字符串
byte[] recvData=new byte[1024]; //接收的数据,必须为字节
byte[] recvData2=new byte[1024]; //接收的数据,必须为字节
byte[] sendData=new byte[1024]; //发送的数据,必须为字节
int recvLen,recvLen2; //接收的数据长度
Thread connectThread,connectThread2; //连接线程
int[] WaveCounts = new int[2];
int[] TPoseCounts = new int[2];
public Queue<string> queueClient1 = new Queue<string>();
public Queue<string> queueClient2 = new Queue<string>();

private System.Object thisLock = new System.Object ();

//初始化
public void InitSocket()

//定义侦听端口,侦听任何IP
ipEnd=new IPEndPoint(IPAddress.Any,2000);
//定义套接字类型,在主线程中定义
socket=new Socket(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp);
//服务端需要绑定ip
try
socket.Bind(ipEnd);

catch (System.Exception ex)

socket.Close ();
Debug.LogError(ex.Message + "\n" + ex.StackTrace);


//定义侦听端口,侦听任何IP
ipEnd2=new IPEndPoint(IPAddress.Any,3000);
//定义套接字类型,在主线程中定义
socket2=new Socket(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp);
//服务端需要绑定ip
try
socket2.Bind(ipEnd2);


catch (System.Exception ex)

socket2.Close ();
Debug.LogError(ex.Message + "\n" + ex.StackTrace);


//定义客户端
IPEndPoint sender=new IPEndPoint(IPAddress.Any,0);
clientEnd=(EndPoint)sender;
print("waiting for UDP dgram");

//开启一个线程连接,必须的,否则主线程卡死
connectThread=new Thread(new ThreadStart(SocketReceive));
connectThread.Start();

//开启一个线程连接,必须的,否则主线程卡死
connectThread2=new Thread(new ThreadStart(SocketReceive2));
connectThread2.Start();


void SocketSend(string sendStr)

//清空发送缓存
sendData=new byte[1024];
//数据类型转换
sendData=Encoding.ASCII.GetBytes(sendStr);
//发送给指定客户端
socket.SendTo(sendData,sendData.Length,SocketFlags.None,clientEnd);


//服务器接收
void SocketReceive()

//进入接收循环
while(true)

//对data清零
recvData=new byte[1024];

//获取客户端,获取客户端数据,用引用给客户端赋值
recvLen=socket.ReceiveFrom(recvData,ref clientEnd);
//输出接收到的数据
recvStr=Encoding.ASCII.GetString(recvData,0,recvLen);

char[] msgDelim = '|' ;
string[] asMessages = recvStr.Split(msgDelim);

if (asMessages.Length > 7)

queueClient1.Enqueue (recvStr);

if (int.Parse (asMessages [0]) == 2)

if (int.Parse (asMessages [6]) == 6) //wave

SetWaveCountsClient1 (2);


else if (int.Parse (asMessages [0]) == 3)
if (int.Parse (asMessages [6]) == 6) //wave
SetWaveCountsClient2 (3);







//服务器接收
void SocketReceive2()

//进入接收循环
while(true)

//对data清零
recvData2=new byte[1024];
//获取客户端,获取客户端数据,用引用给客户端赋值
recvLen2=socket2.ReceiveFrom(recvData2,ref clientEnd);
//输出接收到的数据

recvStr2=Encoding.ASCII.GetString(recvData2,0,recvLen2);

char[] msgDelim = '|' ;
string[] asMessages = recvStr2.Split(msgDelim);

if (asMessages.Length > 7)

queueClient2.Enqueue (recvStr2);

if (int.Parse(asMessages[0]) == 2)


if(int.Parse(asMessages[6]) == 6) //wave


SetWaveCountsClient1(2);



else if (int.Parse(asMessages[0]) == 3)

if (int.Parse(asMessages[6]) == 6) //wave

SetWaveCountsClient2(3);






public void SetWaveCountsClient1(int index)


if (index == 2)

WaveCounts[0]++;



public void SetWaveCountsClient2(int index)

if (index == 3)
WaveCounts[1]++;


public void SetTposeCounts(int index)


if (index == 2)
TPoseCounts[0]++;
else if (index == 3)
TPoseCounts[1]++;


public int GetWaveCounts(int index)

int ret = 0;
if (index == 2)

if (WaveCounts[0] > 0)
ret = WaveCounts[0]--;

else if (index == 3)

if (WaveCounts[1] > 0)
ret = WaveCounts[1]--;

return ret;


public int GetTposeCounts(int index)

int ret = 0;
if (index == 2)

if (TPoseCounts[0] > 0)
ret = TPoseCounts[0]--;

else if (index == 3)

if (TPoseCounts[1] > 0)
ret = TPoseCounts[1]--;

return ret;


//返回接收到的字符串
public string GetRecvStr()

string returnStr="";
//加锁防止字符串被改
if (queueClient1.Count > 0)

lock (/*thisLock*/queueClient1)
//returnStr=recvStr;

returnStr = queueClient1.Dequeue ();


return returnStr;

//返回接收到的字符串
public void setRecvStr()

//加锁防止字符串被改
lock(thisLock)

recvStr = null;


//返回接收到的字符串
public string GetRecvStr2()

string returnStr="";
if (queueClient2.Count > 0)

lock (/*thisLock*/queueClient2)
//returnStr=recvStr;

returnStr = queueClient2.Dequeue ();


return returnStr;

//返回接收到的字符串
public void setRecvStr2()

//加锁防止字符串被改
lock(thisLock)

recvStr2 = null;



//连接关闭
public void SocketQuit()

//关闭线程
if(connectThread!=null)

connectThread.Interrupt();
connectThread.Abort();

if(connectThread2!=null)

connectThread2.Interrupt();
connectThread2.Abort();

//最后关闭socket
if(socket!=null)
socket.Close();
//最后关闭socket
if(socket2!=null)
socket2.Close();
print("disconnect");




客户端代码如下:

using UnityEngine;
using System.Collections;
//引入库
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Xml;
//客户端
public class UdpHelpHandler : MonoBehaviour

//以下默认都是私有的成员
Socket socket; //目标socket
EndPoint serverEnd; //服务端
IPEndPoint ipEnd; //服务端端口
string recvStr; //接收的字符串
string sendStr; //发送的字符串
byte[] recvData=new byte[1024]; //接收的数据,必须为字节
byte[] sendData=new byte[1024]; //发送的数据,必须为字节
int recvLen; //接收的数据长度
Thread connectThread; //连接线程

public bool isClient =true;

//初始化
public void InitSocket(string ipHostString,int port)

//定义连接的服务器ip和端口,可以是本机ip,局域网,互联网
ipEnd=new IPEndPoint(IPAddress.Parse(ipHostString),port);
//定义套接字类型,在主线程中定义
socket=new Socket(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp);

//定义服务端
IPEndPoint sender=new IPEndPoint(IPAddress.Any,0);
serverEnd=(EndPoint)sender;
print("waiting for sending UDP dgram....");
//建立初始连接,这句非常重要,第一次连接初始化了serverEnd后面才能收到消息
//开启一个线程连接,必须的,否则主线程卡死
connectThread=new Thread(new ThreadStart(SocketReceive));
connectThread.Start();


public void SocketSend(string sendStr)

//清空发送缓存
sendData=new byte[1024];
//数据类型转换
sendData=Encoding.ASCII.GetBytes(sendStr);
//发送给指定服务端
socket.SendTo(sendData,sendData.Length,SocketFlags.None,ipEnd);

//服务器接收
void SocketReceive()

//进入接收循环
while(true)

// print("recv thread");
//对data清零
recvData=new byte[1024];
//获取客户端,获取服务端端数据,用引用给服务端赋值,实际上服务端已经定义好并不需要赋值
recvLen=socket.ReceiveFrom(recvData,ref serverEnd);
// print("message from: "+serverEnd.ToString()); //打印服务端信息
//输出接收到的数据
recvStr=Encoding.ASCII.GetString(recvData,0,recvLen);
// print(recvStr);



//连接关闭
public void SocketQuit()

//关闭线程
if(connectThread!=null)

connectThread.Interrupt();
connectThread.Abort();


//最后关闭socket
if(socket!=null)
socket.Close();




文章知识点与官方知识档案匹配
网络技能树首页概览
21577 人正在系统学习中
点击阅读全文
打开CSDN,阅读体验更佳

QT多线程,使用串口接收数据通过UDP端口进行数据转发_是小峰呀的博客-CS...
ui(newUi::Widget)ui->setupUi(this);socket=newQUdpSocket();localThread=newmyThread();timer=newQTimer();socket->bind(3080);//删除注释后,是由按钮控制数据发送,此时需要将带定时器的connet注释。
UDP数据通信,使用一个DatagramSocket实现向多个地址发送数据和接收各个...
往不同的服务器发送数据,只需要启动多个线程,调用上面的方法,替换地址和端口即可 //connect方法的意思是将socket与指定地址绑定,绑定成功后只能往该地址发送数据。并不是建立连接,因为udp是面向非连接的 mSocket.connect(address, hostPort...
c#向指定端口发送数据,监听指定端口
c#向指定端口发送数据,监听指定端口,使用端口监听获取数据信息,向指定端口发送需要的数据
最新发布 C# UDP发送和接收数据类
C# UDP发送和接收数据类
继续访问
UDP端口传递接收数据_wei395107171的博客
UDP端口传递接收数据 package com.udp.test; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.DatagramPacket; import java.net.DatagramSocket;...
...解决端口复用的问题)_酷侠一剑绝ggh的博客_udp端口复用
UDP组播通信(解决端口复用的问题) 最近在写一个组播通信的功能,结果发现接受同一台电脑上只能运行一个接收端,如果运行两个时,第二个运行的程序不能收到数据。查找原因是因为没有设置端口数据复用的功能(setsockpot),setsockpot的调用...
NIO之UDP监听多个端口获取请求信息
最近需要继承一个udp服务,需求是这样的,服务端接收消息,并且支持多个udp端口。 例如: 客户端:port 11112 port 11113 port 11114 服务端:要可以同时监听这三个端口,接收发送的报文。 Select监听端口,然后获取请求数据 附代码 @Override public void run(String... args) throws Exception ...
继续访问
UDP客户端实现在不同端口上发送和接收数据
普通udp通信,客户端在发送完数据后,只需要在相同socket上,recvfrom即可 服务端给的回应,可以是同一端口,也可以是不同端口,客户端在接收时,需要指点一个本地端口进行接收,此端口也可以用bind和创建的socket绑定。 但是bind必须是在通过这个socket发送数据前绑定,在发送数据后再bind会失败。 下面给出代码: #define SEND_PORT 8000
继续访问
发送方 获取 绑定 端口 linux c,多播报文的发送和接收
1实验目的掌握多播的原理及如何进行多播报文的发送和接受2注意事项需包括ws2tcpip.h文件发送者和所有接受者在同一网内不考虑TTL值,回环状态通过setsockopt( )函数设置选项来实现多播数据的发送和接收3试验流程3.1多播数据发送端流程l创建一个数据报套接口l设置多播地址(例:239.192.1.2)和端口号(例:12345)l调用setsockopt( )函数设置发送的数据报本地接口...
继续访问
网络编程之 Udp接收数据
  udp接收数据,网络调试助手担任发送方,但发送时需要对方的也就是虚拟机的ip 和端口,ip可以通过config获取,那么如何让一个程序拥有一个固定端口呢?   创建套接字的时候是没有端口号的,好比买了手机没有手机号,别...
继续访问
C语言实现UDP服务器,客户端
服务器 #include<stdio.h> #include "unistd.h" #include "sys/socket.h" #include "netinet/in.h" #include "arpa/inet.h" #include "string.h" #include "stdlib.h" #define IP "127.0.0.1" #define PORT 8888 int main() int fb=0,len=0; char buf[512]=
继续访问
c udp服务器端一对多持续接收消息,C - 使用select在多个端口上侦听的简单ipv6 udp服务器。从一个端口接收消息,而不是另一个...
#include #include #include #include #include int max(int socket_handle[]);int main(void)int max_clients_allowed = 2;int socket_handle[max_clients_allowed];int client_handle[max_clients_allowed];st...
继续访问
C# 简单的UDP服务器,实现异步接收UDP消息
C# 异步接收UDP消息 源代码 主要方法 async Task ListenForUdp(int port, Action<UdpReceiveResult> receivedHandle) using (var udpClient = new UdpClient(port)) while (true) try receivedHandle(await
继续访问

UDP数据通信,使用一个DatagramSocket实现向多个地址发送数据和接收各个地址的数据返回
有时候需要一个客户端向多个地址发送数据并接收返回的需求 1、创建DatagramSocket DatagramSocket 有多个构造方法 DatagramSocket():创建一个DatagramSocket实例,并将该对象绑定到本机默认IP地址、本机所有可用端口中随机选择的某个端口。 DatagramSocket(int prot):创建一个DatagramSocket实例,并将该对象绑定到本机默认IP地址、指定端口。 DatagramSocket(int port, InetAddre.
继续访问
Python知识点——TCP和UDP的区别
相同点 UDP协议和TCP协议都是传输层协议。 TCP(Transmission Control Protocol,传输控制协议)提供的是面向连接,可靠的字节流服务。即客户和服务器交换数据前,必须现在双方之间建立一个TCP连接,之后才能传输数据。并且提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另一端。 UDP(User Data Protocol,用户数据报协议)是一个简单的面向数据报的运输层协议。它不提供可靠性,只是把应用程序传给IP层的数据报发送出去,但是不能保证它们能到达
继续访问
UDP多线程同时建立多个通信端口
1.需要注意的是:::bind(serSocket, (sockaddr*)&serAddr, sizeof(serAddr)) == SOCKET_ERROR) ,bind()函数前必须添加::,否则,在使用thread头文件后,使用了using namespace std的情况下,会被默认成std::bind,导致编译失败 (1)server #include<WinS...
继续访问
C#winform UDP通信 发送和接收信息
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Net; using System.Net.Sockets; using System.Text;
继续访问
udp多线程 java_多线程以从多个UDP客户端接收数据
我想从不同的客户端接收数据(客户端数量是固定的,比如10),并且每个客户端在5个不同的预定义端口上发送数据,这些端口不会改变 . (例如,客户端1端口5000,5001,5002等) . 所有客户端都可以同时发送数据 . (以上都是固定的)在TCP中说,我可以为我们接受的每个连接创建多个线程,如下所示 . UDP is connectionless,So how can we create ...
继续访问
不同端口间的信息交换-使用udp协议
本文主要内容: 1.套接字(socket)简介; 2.udp简介; 3.udp发送数据及接收数据; 4.模拟qq聊天。 1.套接字(socket)简介 本地可以通过进程PID来唯一标识一个进程,但在网络中这是行不通的。ip地址可以唯一标识网络中的主机,传输层的“协议+端口号”可以唯一标识主机...
继续访问
c语言udp监听多个端口号,多个UDP监听同一个端口
测试结果:客户端的数据总是发给最后一个打开的服务器服务器代码:socket()->setsockopt()->bind()->recvfrom()/sendto()1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 91011 int main(int ar...
继续访问
udp接收多个端口的数据
参考技术A c#udp源端口目的端口不同在于UDP在IP数据报服务之上增加了两个最基本的服务:复用和分用 + 差错检测,常用于一次性传输较少数据的网络应用,如DNS 、SNMP等,因为对于这些应用,若采用TCP,则将为连接创建、维护、拆除带来不小的开销,常用于多媒体应用(IP电话、视频会议、流媒体等)因为可靠传输对于这些应用来说不是最重要的,TCP的拥塞控制会导致数据出现较大的延迟,这是大忌!不保证可靠交付,但并不意味着应用对数据的要求是不可靠的,所有维护可靠性的工作可由用户在应用层完成面向报文的,报文不可分割,是UDP数据报处理的最小单位
2.UDP的优点
·无需建立连接,不会引入建立连接的时延
DNS如果运行在TCP上,速度会慢很多;因此使用UDP,HTTP使用TCP是因为对于基于文本数据的web网页,可靠性是至关重要的
·无连接状态,不维护连接状态,一般能支持更多的活动客户机,TCP需要在端系统中维护连接状态(包括接收和发送缓存、拥塞控制参数和序号与确认号的参数)
·分组首部开销小TCP有20B的首部开销,UDP有8B的开销,没有拥塞控制,应用层能更好地控制要发送的数据和发送时间
UDP没有拥塞控制,因此网络中的拥塞不会影响主机的发送效率
·支持一对一、一对多、多对一和多对多的交互通信。3.UDP的首部格式
UDP数据报包含两部分:UDP首部和用户数据
UDP首部(8B),由4个字段组成,每个字段长度为2B,源端口号:在需要对方回信时选用,不需要时全0,目的端口号:这在终点交付报文时必须使用到UDP长度(8B):UDP数据报的长度(包括首部和数据),其最小值是8(仅有首部),4.校验和:检测UDP数据报中是否有错,有错就丢弃。该字段可选,不使用时全0,当传输层从IP层收到UDP数据报时,就根据首部中的目的端口,把UDP数据报通过相应的端口上交给应用进程。祝你生活愉快谢谢提问😊

每日一题 | day31(分解因数)

选择题

1、下面关于源端口地址和目标端口地址的描述中,正确的是( )
A 在TCP/UDP传输段中,源端口地址和目的端口地址是不能相同的
B 在TCP/UDP传输段中,源端口地址和目的端口地址必须是相同的
C 在TCP/UDP传输段中,源端口地址和目的端口地址是可以相同的
D 以上描述均不正确

正确答案 A:在TCP/UDP传输段中,源端口地址和目的段口地址是不能相同的,否则就会建立自己到自己的连接,白白耗费资源。网络攻击中的LAND就是利用这个这一点进行攻击的

2、SNMP 使用 udp 161 和 162 端口,则该协议属于 TCP/IP 模型中的()
A 网络层
B 数据链路层
C 应用层
D 传输层

正确答案 C:简单网络管理协议(SNMP) 是专门设计用于在 IP 网络管理网络节点(服务器、工作站、路由器、交换机及HUBS等)的一种标准协议,它是一种应用层协议

3、主机 A 向主机 B 连续发送了两个 TCP 报文段,其序号分包是 70 和 100 ,如果 A 发送的第一个报文段丢失了,但第二个报文段达到了 B , B 在第二个报文段到达后向 A 发送确认,那么这个确认号是多少?
A 100
B 101
C 70
D 71

正确答案 C:

4、以下说法不正确的是()
A HTTP是一种请求/响应式的协议
B HTTP请求消息中Accept表示浏览器可接受的MIME类型
C HTTP请求消息中Accept-Encoding表示浏览器能够进行解码的数据编码方式
D HTTP请求消息中Css表示初始URL中的主机和端口

正确答案 D:

5、关于计算机网络,下列描述当中,正确的是()
A 在同一信道上同一时刻,可进行双向数据传送的通信方式是半双工
B TCP协议是无连接的;UDP协议是面向连接的
C 假设一个主机的ip地址为192.168.8.123,而子网掩码为255.255.255.248,那么该主机的网络号是192.168.8.120
D 计算机网络中的OSI结构分别是:物理层,数据链路层,传输层,会话层,表示层,应用层

正确答案 C:在同一信道上同一时刻,可进行双向数据传送的通信方式是全双工,不是同一时刻双向通信的是半双工。

编程题

题目1
在这里插入图片描述
题解思路:质因子分解和前一天的题类似,只是我们需要将其输出出来
每日一题| day30(最难的问题 | 因子个数)
代码

#include <iostream>
#include <vector>
#include <math.h>
using namespace std;

int main()
{
    int n;
    while (cin >> n)
    {
        vector<int> res;
        int tmp = n;
        for (int i = 2; i <= sqrt(n); ++i)
        {
            while (n % i == 0)
            {
                res.push_back(i);
                n /= i;
            }
        }
        cout << tmp << " = ";
        if (n == tmp)//素数
            cout << n;
        else
        {
            if (n != 1)//最后为1则不放入
                res.push_back(n);
            cout << res[0];
            for (int i = 1; i < res.size(); ++i)
            {
                cout << " * " << res[i];
            }
        }
        cout << endl;
    }
    return 0;
}

以上是关于c#udp源端口目的端口不同的主要内容,如果未能解决你的问题,请参考以下文章

报文分析5UDP协议的头结构

白话浅说TCP/UDP面向连接,面向无连接的区别

UDP的报文结构及注意事项

如何在c中设置UDP套接字中的源端口?

如果您安装了防火墙请确认防火墙未拦截本机的UDP通讯报文(源端口:80目的端口53)您可以通过设置防火墙

UDP协议