UDP网络编程(UDP协议编程)

http://www.itjxue.com  2023-02-03 00:42  来源:未知  点击次数: 

bind操作不会阻塞

热门频道

?

首页

?

博客

?

研修院

?

VIP

?

APP

?

问答

?

下载

?

社区

推荐频道

?

活动

?

招聘

?

专题

打开CSDN APP

Copyright ? 1999-2020, CSDN.NET, All Rights Reserved

?

?

打开APP

?

?

??

Hilaph

关注

Windows UDP recvfrom 不能阻塞 及 bind 报错的解决办法 原创

2020-07-09 18:44:15

?

Hilaph ?

码龄6年

关注

1、正常来说,UDP的recvfrom默认是阻塞的。

可以手动设置是否为阻塞

u_long iMODE = 0;//1为非阻塞,0为阻塞

ioctlsocket(udp_cliSocket, FIONBIO, iMODE);//设置recvfrom是否为阻塞

ioctlsocket的第一个参数为socket套接字。

此处我设置为0,依然会不阻塞。

2、如果bind失败了,也会导致recvfrom不阻塞。

if (bind(udp_cliSocket, (SOCKADDR*)locAddr, sizeof(locAddr)) == SOCKET_ERROR)

{

printf("UDP bind ERROR :%d\n", WSAGetLastError());

}

如果bind=SOCKET_ERROR时,说明bind失败,通过WSAGetLastError获取报错信息为10049——不能分配请求的地址。

再次检查前面的代码,发现添加本地ip时给错了地址。。。

文章知识点与官方知识档案匹配

网络技能树首页概览

21461 人正在系统学习中

打开CSDN,阅读体验更佳

?

?

UDP服务recvfrom函数设置非阻塞_leon_zeng0的博客_recvfrom...

所以,接收情况的判断需要利用recvfrom 的返回值。 新的补充: 不用上面那样复杂,也可以直接用不阻塞标志,如下: ret=recvfrom(sockfd,recvbuff,recvbufflen,MSG_DONTWAIT,( struct sockaddr *) cliaddr, clientlen); 就是flags标志...

继续访问

recvfrom函数 非阻塞_IO - 同步、异步、阻塞、非阻塞

2 同步非阻塞IO process在NonBlocking IO读recvfrom操作的第一个阶段是不会block等待的,如果kernel数据还没准备好,那么recvfrom会立刻返回一个EWOULDBLOCK错误。当kernel准备好数据后,进入处理的第二阶段的时候,process会等待kernel将数据copy...

继续访问

最新发布 UDP socket 设置为的非阻塞模式

非阻塞写的情况下,是采用可以写多少就写多少的策略.与读不一样的地方在于,有多少读多少是由网络发送的那一端是否有数据传输到为标准,但是对于可以写多少是由本地的网络堵塞情况为标准的,在网络阻塞严重的时候,网络层没有足够的内存来进行写操作,这时候就会出现写不成功的情况,阻塞情况下会尽可能(有可能被中断)等待到数据全部发送完毕, 对于非阻塞的情况就是一次写多少算多少,没有中断的情况下也还是会出现write 到一部分的情况.对于一个TCP套接口,内核将从应用进程的缓冲区到该套接口的发送缓冲区拷贝数据。

继续访问

【网络协议】转载:关于TCP与UDP的接收recv和recvfrom

关于TCP与UDP的接收recv和recvfrom 技术标签: 网络协议 计算机网络 1.UDP发包的问题 问:udp 发送(sendto)两次数据,第一次 100字节 ,第二次200字节, 接包方一次recvfrom( 1000 ), 收到是 100,还是200,还是300? 答:UDP是数据报文协议,是以数据包方式,所以每次可以接收100,200,在理想情况下,第一次是无论recvfrom多少都是接收到100。当然,可能由于网络原因,第二个包先到的话,有可能是200了。对可能会由于网络原因乱序,所

继续访问

【提供可能的解决思路】本地编写UDP通信,recvfrom不阻塞,并一直返回-1

【提供可能的解决思路】本地编写UDP通信,recvfrom不阻塞,并一直返回-1 记录一个使用socket库中遇到的问题,最近项目中遇到使用本地udp通信的情况,在编写程序过程中,发现调用recvfrom一直失败,返回-1,错误码10022。 排查了半个下午,终于发现原来是bind函数的问题。 由于在文件开头使用了 using namespace std 导致默认的bind变成了 functional.h中的那个,而不是socket的bind,导致绑定一直没有成功。 解决方案: 1.不要在文件中用 usi

继续访问

socket学习:windows平台用udp模式接收数据,recvfrom函数返回值为-1,但是接收缓冲区中中却有数据

现象:windows平台用udp模式接收数据,recvfrom函数返回值为-1,但是接收缓冲区中中却有数据 方法:用GetLastError(),errno为10040, 错误含义: 一个在数据报套接字上发送的消息大于内部消息缓冲器或其他一些网络限制,或该用户用于接收数据报的缓冲器比数据报小 最后发现原因:接收缓冲buf设置较小,发送方发送的数据超出了接收位置的长度 ...

继续访问

热门推荐 UDP服务recvfrom函数设置非阻塞

基本概念: 方法一:通过fcntl函数将套接字设置为非阻塞模式。 方法二:通过套接字选项SO_RECVTIMEO设置超时。 方法一源码,编译:g++ udp_server.cpp -o server #include #include #include #include #include #include #include #include #include #i

继续访问

关于send和recv在UDP的使用

在socket编程中,包括有连接和无连接两种方式,其流程如下: 有连接: TCP客户端的流程一般是 socket-【bind】-connect-send/recv 无连接: UDP客户端的流程一般是 socket-【bind】-sendto/recvfrom send与sento相比,没有提供对方的地址,在有连接模式中, 连接已经事先建立好,当然不需要每次都提供对方地址。但是,即使在无连接模式中,...

继续访问

C++ UDP通信,recvfrom函数一直堵塞

对于UDP通信中,recvfrom函数一直阻塞的问题,首先要检查发送端……

继续访问

recvfrom不阻塞_一文带你区分阻塞、非阻塞、同步、异步IO

前言:在之前的Redis面试套路拆解的文章[Redis面试套路拆解(一)]中有提到过IO模型,并且IO模型本身也是一个比较容易混淆的高频面试考点,小黑板将在本篇文章帮你理清思路,区分各种IO模型~其实网络上已经有很多博客讲了这个问题,但是总是觉得看完之后还是迷迷糊糊的,感觉大家有点太执着于把这个问题讲的通俗易懂了,经常会举各种各样的例子,比如烧水、去银行办理业务之类的,然而看完之后反倒会产生更多的...

继续访问

?

SOCKET编程UDP,bind失败

佛了竟然是因为端口号 一直bind失败,找不到原因,没想到端口号的问题,可能是因为端口号已绑定,换个端口号; ret = bind(sServer, (SOCKADDR *)ServerAddr, sizeof(ServerAddr)); std::cout ret; if ( ret== SOCKET_ERROR) { printf("BIND失败!\n"); return; } ...

继续访问

linux select read阻塞_阻塞非阻塞同步异步之间的关系

一:阻塞与非阻塞阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态.阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态.阻塞调用是指调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回。非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程。1.blockingIO(阻塞):1.1:阻塞调用是指调用结果返回之前,当前线程会被挂起。函数只有在得到结果之后...

继续访问

TCP、UDP 通信常用函数send,sendto,recv,recvfrom详解

send函数 int send( SOCKET s, const char FAR *buf, int len, int flags ); 不论是客户还是服务器应用程序都用send函数来向TCP连接的另一端发送数据。 客户程序一般用send函数向服务器发送请求,而服务器则通常用send函数来向客户程序发送应答。 该函数的第一个参数指定发送端套接字描述符; 第二个参数指...

继续访问

非阻塞recvfrom的设置

我想用UDP阻塞模式给硬件设备发包,然后收包。因为网络的问题,经常丢包,也就是发了之后没有响应。这样的话,recvfrom会一直停在那里,死机了一样。 能不能设成超时自动返回,或者其它什么解决办法,谢谢! 我不想用非阻塞模式,据说比较耗资源。 //连接超时 //----------------

继续访问

udp_recv(UDP服务器端)

#include stdio.h #include string.h #include strings.h #include stdlib.h #include sys/types.h #include sys/socket.h #include arpa/inet.h #define BUFSIZE 64 #define PORT 8888 #define IP “0.0.0.0” int ma

继续访问

linux socket read 阻塞

read函数只是一个通用的读文件设备的接口。是否阻塞需要由设备的属性和设定所决定。一般来说,读字符终端、网络的socket描述字,管道文件等,这些文件的缺省read都是阻塞的方式。如果是读磁盘上的文件,一般不会是阻塞方式的。但使用锁和fcntl设置取消文件O_NOBLOCK状态,也会产生阻塞的read效果。 怎么样以非阻塞的方式从管道中读取数据?因为我用read函数时,如果管道没有数据就会阻塞住

继续访问

如何将UDP的recvfrom函数设置为非阻塞或阻塞超时

本文先介绍我查看了的2篇文章,然后介绍linux 和windows 下的非阻塞设置。最后是非阻塞情况下接收情况的判断。 2篇博文 其实UDP的非阻塞也可以理解成和TCP是一样的,都是通过socket的属性去做。 方法一:通过fcntl函数将套接字设置为非阻塞模式。 方法二:通过套接字选项SO_RECVTIMEO设置超时。 ...

继续访问

网络编程原理与UDP实现

如何发送数据包? Q:当应用程序产生数据的时候,需要去构造数据包并发送到网络上去,但是由谁负责处理呢? A:现代操作系统负责数据包得构造与发送,应用程序只需提供数据。 当应用程序产生数据时,应用程序将数据交给OS内核,然后在OS内核添加各层的首部,构建好数据包,然后交给网卡,发送到网络中去。 Q:应用程序如何向OS 发送数据呢? A: OS为程序提供了一个接口,即socket API,类似于系统调用函数。 Q:通过socket API,只需要提供数据吗? A:并不,还需要告诉OS 内核,目的端口是什么

继续访问

从另一个线程将recvfrom从阻塞状态唤醒

UDP的多线程程序,一般开一个线程循环调用recvfrom接收消息,当程序中止的时候,如果这个线程阻塞在recvfrom调用,并且没有消息到达,则这个线程无法终止,造成资源泄露等问题。 这里终止这个线程有六种方法: 1. 释放监听的fd,这个是最简单的方法,但是有一点要注意,就是close(fd)系统调用无效,必须要使用shutdown(fd, SHUT_RDWR)来将recvfrom唤醒,因

继续访问

Udp端口绑定失败

前段时间部署业务系统时候,需要用到udp广播的组件都无法启动,报错RuntimeError:bind fail in line of file ../../source/udpnetwork/UdpClient.cpp 段错误 吐核。排查配置文件搞了挺久,最后发现udp广播用的网段,PREFIX不是24,导致广播段不是默认的XX.XX.XX.255。配置文件默认是255,后面改了广播端地址后,绑定就正常了。 ...

继续访问

recvfrom不阻塞

经验分享

?写评论

?

评论

?

4

?

点赞

?

?

分享

打开CSDN APP阅读体验更佳

Golang 网络编程丝绸之路 - TCP/UDP 地址解析

TL;DR 在使用 Golang 编写 TCP/UDP socket 的时候,第一步做的就是地址解析。

该函数返回的地址包含的信息如下:

TCPAddr 里, IP 既可以是 IPv4 地址,也可以是 IPv6 地址。 Port 就是端口了。 Zone 是 IPv6 本地地址所在的区域。

从返回结果看该函数的参数, network 指 address 的网络类型; address 指要解析的地址,会从中解析出我们想要的 IP , Port 和 Zone 。

从源码中可以看出,参数 network 只能是如下四个值,否则会得到一个错误。

解析过程跟 ResolveTCPAddr 的一样,不过得到的是 *UDPAddr 。

UDPAddr 包含的信息如下:

在javasocket网络编程中,开发基于udp协议的程序使用的套接字有哪些

一、 填空题

___ IP地址____用来标志网络中的一个通信实体的地址。通信实体可以是计算机,路由器等。

统一资源定位符URL是指向互联网“资源”的指针,由4部分组成:协议、存放资源的主机域名、__端口___和资源路径和文件名。

URL 是统一资源定位器的简称,它表示Internet上某一资源的地址。

在Socket编程中,IP地址用来标志一台计算机,但是一台计算机上可能提供多种应用程序,使用 端口 来区分这些应用程序。

在Java Socket网络编程中,开发基于TCP协议的服务器端程序使用的套接字是 ServerSocket 。

在Java Socket网络编程中,开发基于UDP协议的程序使用的套接字是 DatagramSocket 。

二、 选择题

1.以下协议都属于TCP/IP协议栈,其中位于传输层的协议是(AD)。(选择二项)

A TCP

B.HTTP

C.SMTP

D.UDP

2.以下协议中属于TCP/IP协议栈中应用层协议的是(A)。(选择一项)

A HTTP

B.TCP

C.UDP

D.IP

3.以下说法中关于UDP协议的说法正确的是(AD)。(选择二项)

A.发送不管对方是否准备好,接收方收到也不确认

B.面向连接

C.占用系统资源多、效率低

D.非常简单的协议,可以广播发送

4.在基于TCP网络通信模式中,客户与服务器程序的主要任务是(BC)。(选择二项)

A 客户程序在网络上找到一条到达服务器的路由

B.客户程序发送请求,并接收服务器的响应

C.服务器程序接收并处理客户请求,然后向客户发送响应结果

D.如果客户程序和服务器都会保证发送的数据不会在传输途中丢失

5.在Java网络编程中,使用客户端套接字Socket创建对象时,需要指定(A)。(选择一项)

A 服务器主机名称和端口

B.服务器端口和文件

C.服务器名称和文件

D.服务器地址和文件

6.ServerSocket的监听方法accept( )方法的返回值类型是(A )。(选择一项)

A.Socket

B.Void

C.Object

D.DatagramSocket

7.Java UDP Socket编程主要用到的两个类是(BD)。(选择二项)

A UDPSocket

B.DatagramSocket

C.UDPPacket

D.DatagramPacket

8.在使用UDP套接字通信时,常用(D)类把要发送的信息打包。(选择一项)

A String

B.DatagramSocket

C.MulticastSocket

D.DatagramPacket

三、 判断题

1. Socket是传输层供给应用层的编程接口,是应用层与传输层之间的桥梁 。( T )

2. TCP/IP传输控制协议是Internet的主要协议,定义了计算机和外设进行通信的规则。TCP/IP网络参考模型包括七个层次:应用层、会话层、表示层、传输层、网络层、链路层和物理层。( F )

3. TCP协议一种面向连接的、可靠的、基于字节流的通信协议 。HTTP、FTP、TELNET、SMTP 都是基于TCP协议的应用层协议。( T )

4. UDP协议是一种面向无连接的、可靠的、基于字节流的传输层通信协议,该协议占用系统资源多、效率较低。( F )

四、 简答题

1.TCP/IP协议栈中,TCP协议和UDP协议的联系和区别?

2.简述基于TCP的Socket编程的主要步骤。提示:分别说明服务器端和客户端的编程步骤。

3.简述基于UDP的Socket编程的主要步骤。提示:分别说明服务器端和客户端的编程步骤。

五、 编码题

1.使用基于TCP的Java Socket编程,完成如下功能:

1) 要求从客户端录入几个字符,发送到服务器端。

2) 由服务器端将接收到的字符进行输出。

3) 服务器端向客户端发出“您的信息已收到”作为响应。

4) 客户端接收服务器端的响应信息。

提示:

服务器端:PrintWriter out =new PrintWriter(socket.getOutputStream(),true);

客户端:BufferedReader line=new BufferedReader(new InputStreamReader(System.in));

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 Queuestring queueClient1 = new Queuestring();

public Queuestring queueClient2 = new Queuestring();

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服务器,客户端

服务器 #includestdio.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, ActionUdpReceiveResult 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 #includeWinS...

继续访问

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接收多个端口的数据

c#网络编程UDP例子

using?System;?

using?System.Net;?

using?System.Net.Sockets;?

using?System.Text;?

using?System.Threading;?

using?System.Windows.Forms;?

?namespace?UDPClient?

{?

????public?partial?class?frmUdp?:?Form?

????{?

????????private?UdpClient?sendUdpClient;?

????????private?UdpClient?receiveUpdClient;?

????????public?frmUdp()?

????????{?

????????????InitializeComponent();?

????????????IPAddress[]?ips?=?Dns.GetHostAddresses("");?

????????????tbxlocalip.Text?=?ips[2].ToString();?

????????????int?port?=?51883;?

????????????tbxlocalPort.Text?=?port.ToString();?

????????????tbxSendtoIp.Text?=?ips[2].ToString();?

????????????tbxSendtoport.Text?=?port.ToString();?

????????}?

?

????????//?接受消息?

????????private?void?btnReceive_Click(object?sender,?EventArgs?e)?

????????{?

????????????//?创建接收套接字?

????????????IPAddress?localIp?=?IPAddress.Parse(tbxlocalip.Text);?

????????????IPEndPoint?localIpEndPoint?=?new?IPEndPoint(localIp,?int.Parse(tbxlocalPort.Text));?

????????????receiveUpdClient?=?new?UdpClient(localIpEndPoint);?

?

?

????????????Thread?receiveThread?=?new?Thread(ReceiveMessage);?

????????????receiveThread.Start();?

????????}?

?

????????//?接收消息方法?

????????private?void?ReceiveMessage()?

????????{?

????????????IPEndPoint?remoteIpEndPoint?=?new?IPEndPoint(IPAddress.Any,?0);?

????????????while?(true)?

????????????{?

????????????????try?

????????????????{?

????????????????????//?关闭receiveUdpClient时此时会产生异常?

????????????????????byte[]?receiveBytes?=?receiveUpdClient.Receive(ref?remoteIpEndPoint);?

?

????????????????????string?message?=?Encoding.Unicode.GetString(receiveBytes);?

?

????????????????????//?显示消息内容?

????????????????????ShowMessageforView(lstbxMessageView,?string.Format("{0}[{1}]",?remoteIpEndPoint,?message));?

????????????????}?

????????????????catch?

????????????????{?

????????????????????break;?

????????????????}?

????????????}?

????????}?

?

????????//?利用委托回调机制实现界面上消息内容显示?

????????delegate?void?ShowMessageforViewCallBack(ListBox?listbox,?string?text);?

????????private?void?ShowMessageforView(ListBox?listbox,?string?text)?

????????{?

????????????if?(listbox.InvokeRequired)?

????????????{?

????????????????ShowMessageforViewCallBack?showMessageforViewCallback?=?ShowMessageforView;?

????????????????listbox.Invoke(showMessageforViewCallback,?new?object[]?{?listbox,?text?});?

????????????}?

????????????else?

????????????{?

????????????????lstbxMessageView.Items.Add(text);?

????????????????lstbxMessageView.SelectedIndex?=?lstbxMessageView.Items.Count?-?1;?

????????????????lstbxMessageView.ClearSelected();?

????????????}?

????????}?

????????private?void?btnSend_Click(object?sender,?EventArgs?e)?

????????{?

????????????if?(tbxMessageSend.Text?==?string.Empty)?

????????????{?

????????????????MessageBox.Show("发送内容不能为空","提示");?

????????????????return;?

????????????}?

?

????????????//?选择发送模式?

????????????if?(chkbxAnonymous.Checked?==?true)?

????????????{?

????????????????//?匿名模式(套接字绑定的端口由系统随机分配)?

????????????????sendUdpClient?=?new?UdpClient(0);?

????????????}?

????????????else?

????????????{?

????????????????//?实名模式(套接字绑定到本地指定的端口)?

????????????????IPAddress?localIp?=?IPAddress.Parse(tbxlocalip.Text);?

????????????????IPEndPoint?localIpEndPoint?=?new?IPEndPoint(localIp,?int.Parse(tbxlocalPort.Text));?

????????????????sendUdpClient?=?new?UdpClient(localIpEndPoint);?

????????????}?

?

????????????Thread?sendThread?=?new?Thread(SendMessage);?

????????????sendThread.Start(tbxMessageSend.Text);?

????????}?

?

????????//?发送消息方法?

????????private?void?SendMessage(object?obj)?

????????{?

????????????string?message?=?(string)obj;?

????????????byte[]?sendbytes?=?Encoding.Unicode.GetBytes(message);?

????????????IPAddress?remoteIp?=?IPAddress.Parse(tbxSendtoIp.Text);?

????????????IPEndPoint?remoteIpEndPoint?=?new?IPEndPoint(remoteIp,?int.Parse(tbxSendtoport.Text));?

????????????sendUdpClient.Send(sendbytes,?sendbytes.Length,?remoteIpEndPoint);?

???????????

????????????sendUdpClient.Close();?

????????????

????????????//?清空发送消息框?

????????????ResetMessageText(tbxMessageSend);?

????????}?

?

????????//?采用了回调机制?

????????//?使用委托实现跨线程界面的操作方式?

????????delegate?void?ResetMessageCallback(TextBox?textbox);?

????????private?void?ResetMessageText(TextBox?textbox)?

????????{?

????????????//?Control.InvokeRequired属性代表?

????????????//?如果空间的处理与调用线程在不同线程上创建的,则为true,否则为false?

????????????if?(textbox.InvokeRequired)?

????????????{?

????????????????ResetMessageCallback?resetMessagecallback?=?ResetMessageText;?

????????????????textbox.Invoke(resetMessagecallback,?new?object[]?{?textbox?});?

????????????}?

????????????else?

????????????{?

????????????????textbox.Clear();?

????????????????textbox.Focus();?

????????????}?

????????}?

?

????????//?停止接收?

????????private?void?btnStop_Click(object?sender,?EventArgs?e)?

????????{?

????????????receiveUpdClient.Close();?

????????}?

?

????????//?清空接受消息框?

????????private?void?btnClear_Click(object?sender,?EventArgs?e)?

????????{?

????????????this.lstbxMessageView.Items.Clear();?

????????}?

????}?

}

(责任编辑:IT教学网)

更多

推荐浏览下载文章