网络编程udp实验报告linux(udp实验报告总结)

http://www.itjxue.com  2023-02-24 21:26  来源:未知  点击次数: 

Linux编程的几个重要知识点

第一阶段:linux基础入门

Linux基础入门主要包括: Linux硬件基础、Linux发展历史、Linux系统安装、xshell连接、xshell优化、SSH远程连接故障问题排查、L inux基础优化、Linux目录结构知识、Linux文件属性、Linux通配符、正则表达式、Linux系统权限等

第二阶段:linux系统管理进阶

linux系统管理进阶包括:Linux定时任务、Linux用户管理、Linux磁盘与文件系统、Linux三剑客之sed命令等。

第三阶段:Linux Shell基础

Linux Shell基础包括:Shell编程基础、Linux三剑客之awk命令等。

第四阶段:Linux网络基础

第五阶段:Linux网络服务

Linux网络服务包括:集群实战架构开始及环境准备、rsync数据同步服务、Linux全网备份项目、nfs网络存储服务精讲、inotify/sersync实时数据同步/nfs存储实时备份项目等。

第六阶段:Linux重要网络服务

Linux重要网络服务包括:http协议/www服务基础、nginx web介绍及基础实践、nginx web、lnmp环境部署/数据库异机迁移/共享数据异机迁移到NFS系统、nginx负载均衡、keepalived高可用等。

第七阶段:Ansible自动化运维与Zabbix监控

Ansible自动化运维与Zabbix监控包括: SSH服务秘钥认证、ansible批量自动化管理集群、 zabbix监控等。

第九阶段:大规模集群高可用服务(Lvs、Keepalived)

第十阶段:Java Tomcat服务及防火墙Iptables

第十一阶段:MySQL DBA高级应用实践

MySQL DBA高级应用实践包括:MySQL数据库入门基础命令、MySQL数据库进阶备份恢复、MySQL数据库深入事务引擎、MySQL数据库优化SQL语句优化、MySQL数据库集群主从复制/读写分离、MySQL数据库高可用/mha/keepalved等。

第十二阶段:高性能数据库Redis和Memcached课程

第十三阶段:Linux大规模集群架构构建(200台)

第十四阶段:Linux Shell编程企业案例实战

第十五阶段:企业级代码发布上线方案(SVN和Git)

第十六阶段企业级Kvm虚拟化与OpenStack云计算

第十七阶段公有云阿里云8大组件构建集群实战

第十八阶段:Docker技术企业应用实践

第十九阶段:Python自动化入门及进阶

第二十阶段:职业规划与高薪就业指导

linux 下用socket 文件传输问题(UDP)

要下班了,时间急,不写代码了先给你一个思路

1 实现最简单的udp socket 模型,实现发送一个字符串。

2 实现一个简单的打开文件,读取文件的例子,如用fgets(),类似的函数有很多,然后再把读取的文件内容忘另一个文件里写(相关函数fopen(),write(),read())。

3 把上面两个函数结合到一起,在客户端实现打开要传送的文件,按一定的大小读取,读取后调用sendto()发送到服务器端。在服务器端创建一个文件,然后调用recvfrom()接受客户端发送过来的数据,向来是创建的那个文件中写。

下面是改好的udp发送文件的例子。

服务器端程序的编译

gcc -o file_server? file_server

客户端程序的编译

gcc -o file_client? file_client.c

服务器程序和客户端程应当分别运行在2台计算机上.

服务器端程序的运行,在一个计算机的终端执行

./file_server

客户端程序的运行,在另一个计算机的终端中执行

./file_client? 运行服务器程序的计算机的IP地址

根据提示输入要传输的服务器上的文件,该文件在服务器的运行目录上

在实际编程和测试中,可以用2个终端代替2个计算机,这样就可以在一台计算机上测试网络程序,

服务器端程序的运行,在一个终端执行

./file_server

客户端程序的运行,在另一个终端中执行

./file_client? 127.0.0.1

说明: 任何计算机都可以通过127.0.0.1访问自己. 也可以用计算机的实际IP地址代替127.0.0.1

//////////////////////////////////////////////////////////////////////////////////////

// file_server.c? 文件传输顺序服务器示例

//////////////////////////////////////////////////////////////////////////////////////

//本文件是服务器的代码

#include netinet/in.h??? // for sockaddr_in

#include sys/types.h??? // for socket

#include sys/socket.h??? // for socket

#include stdio.h??? ??? // for printf

#include stdlib.h??? ??? // for exit

#include string.h??? ??? // for bzero

/*

#include sys/types.h

#include sys/stat.h

#include fcntl.h

#include unistd.h

*/

#define HELLO_WORLD_SERVER_PORT??? 6666

#define LENGTH_OF_LISTEN_QUEUE? 20

#define BUFFER_SIZE 1024

#define FILE_NAME_MAX_SIZE 512

int main(int argc, char **argv)

{

??? //设置一个socket地址结构server_addr,代表服务器internet地址, 端口

??? struct sockaddr_in server_addr, pcliaddr;

??? bzero(server_addr,sizeof(server_addr)); //把一段内存区的内容全部设置为0

??? server_addr.sin_family = AF_INET;

??? server_addr.sin_addr.s_addr = htons(INADDR_ANY);

??? server_addr.sin_port = htons(HELLO_WORLD_SERVER_PORT);

??? //创建用于internet的据报套接字(UDPt,用server_socket代表服务器socket

// 创建数据报套接字(UDP)

??? int server_socket = socket(PF_INET,SOCK_DGRAM,0);

??? if( server_socket 0)

??? {

??? ??? printf("Create Socket Failed!");

??? ??? exit(1);

??? }

???

??? //把socket和socket地址结构联系起来

??? if( bind(server_socket,(struct sockaddr*)server_addr,sizeof(server_addr)))

??? {

??? ??? printf("Server Bind Port : %d Failed!", HELLO_WORLD_SERVER_PORT);

??? ??? exit(1);

??? }

???

??? while (1) //服务器端要一直运行

??? {

??? ??? //定义客户端的socket地址结构client_addr

??? ??? struct sockaddr_in client_addr;

??? ??? socklen_t n = sizeof(client_addr) ;

int length;

??? ??? char buffer[BUFFER_SIZE];

??? ??? bzero(buffer, BUFFER_SIZE);

??? ??? length = recvfrom(new_server_socket,buffer,BUFFER_SIZE,0,pcliaddr,n);

??? ??? if (length 0)

??? ??? {

??? ??? ??? printf("Server Recieve Data Failed!\n");

??? ??? ??? break;

??? ??? }

??? ??? char file_name[FILE_NAME_MAX_SIZE+1];

??? ??? bzero(file_name, FILE_NAME_MAX_SIZE+1);

??? ??? strncpy(file_name, buffer, strlen(buffer)FILE_NAME_MAX_SIZE?FILE_NAME_MAX_SIZE:strlen(buffer));

//??? ??? int fp = open(file_name, O_RDONLY);

//??? ??? if( fp 0 )

??? ??? FILE * fp = fopen(file_name,"r");

??? ??? if(NULL == fp )

??? ??? {

??? ??? ??? printf("File:\t%s Not Found\n", file_name);

??? ??? }

??? ??? else

??? ??? {

??? ??? ??? bzero(buffer, BUFFER_SIZE);

??? ??? ??? int file_block_length = 0;

//??? ??? ??? while( (file_block_length = read(fp,buffer,BUFFER_SIZE))0)

??? ??? ??? while( (file_block_length = fread(buffer,sizeof(char),BUFFER_SIZE,fp))0)

??? ??? ??? {

??? ??? ??? ??? printf("file_block_length = %d\n",file_block_length);

??? ??? ??? ??? //发送buffer中的字符串到new_server_socket,实际是给客户端

??? ??? ??? ??? if(send(new_server_socket,buffer,file_block_length,0)0)

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

??? ??? ??? ??? ??? printf("Send File:\t%s Failed\n", file_name);

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

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

??? ??? ??? ??? bzero(buffer, BUFFER_SIZE);

??? ??? ??? }

//??? ??? ??? close(fp);

??? ??? ??? fclose(fp);

??? ??? ??? printf("File:\t%s Transfer Finished\n",file_name);

??? ??? }

??? }

}

//////////////////////////////////////////////////////////////////////////////////////

// file_client.c? 文件传输客户端程序示例

//////////////////////////////////////////////////////////////////////////////////////

//本文件是客户机的代码

#include netinet/in.h??? // for sockaddr_in

#include sys/types.h??? // for socket

#include sys/socket.h??? // for socket

#include stdio.h??? ??? // for printf

#include stdlib.h??? ??? // for exit

#include string.h??? ??? // for bzero

/*

#include sys/types.h

#include sys/stat.h

#include fcntl.h

#include unistd.h

*/

#define HELLO_WORLD_SERVER_PORT??? 6666

#define BUFFER_SIZE 1024

#define FILE_NAME_MAX_SIZE 512

int main(int argc, char **argv)

{

??? if (argc != 2)

??? {

??? ??? printf("Usage: ./%s ServerIPAddress\n",argv[0]);

??? ??? exit(1);

??? }

??? //设置一个socket地址结构client_addr,代表客户机internet地址, 端口

??? struct sockaddr_in client_addr;

??? bzero(client_addr,sizeof(client_addr)); //把一段内存区的内容全部设置为0

??? client_addr.sin_family = AF_INET;??? //internet协议族

??? client_addr.sin_addr.s_addr = htons(INADDR_ANY);//INADDR_ANY表示自动获取本机地址

??? client_addr.sin_port = htons(0);??? //0表示让系统自动分配一个空闲端口

??? //创建用于internet的流协议(TCP)socket,用client_socket代表客户机socket

??? int client_socket = socket(AF_INET,SOCK_DGRAM,0);

??? if( client_socket 0)

??? {

??? ??? printf("Create Socket Failed!\n");

??? ??? exit(1);

??? }

??? //设置一个socket地址结构server_addr,代表服务器的internet地址, 端口

??? struct sockaddr_in server_addr;

??? bzero(server_addr,sizeof(server_addr));

??? server_addr.sin_family = AF_INET;

??? if(inet_aton(argv[1],server_addr.sin_addr) == 0) //服务器的IP地址来自程序的参数

??? {

??? ??? printf("Server IP Address Error!\n");

??? ??? exit(1);

??? }

??? server_addr.sin_port = htons(HELLO_WORLD_SERVER_PORT);

??? socklen_t server_addr_length = sizeof(server_addr);

??? char file_name[FILE_NAME_MAX_SIZE+1];

??? bzero(file_name, FILE_NAME_MAX_SIZE+1);

??? printf("Please Input File Name On Server:\t");

??? scanf("%s", file_name);

???

??? char buffer[BUFFER_SIZE];

??? bzero(buffer,BUFFER_SIZE);

??? strncpy(buffer, file_name, strlen(file_name)BUFFER_SIZE?BUFFER_SIZE:strlen(file_name));

??? //向服务器发送buffer中的数据

??? ?socklen_t n = sizeof(server_addr) ;

??? sendto(client_socket,buffer,BUFFER_SIZE,0,(struct sockaddr*)server_addr,n);

//??? int fp = open(file_name, O_WRONLY|O_CREAT);

//??? if( fp 0 )

??? FILE * fp = fopen(file_name,"w");

??? if(NULL == fp )

??? {

??? ??? printf("File:\t%s Can Not Open To Write\n", file_name);

??? ??? exit(1);

??? }

???

??? //从服务器接收数据到buffer中

??? bzero(buffer,BUFFER_SIZE);

??? int length = 0;

??? while( length = recv(client_socket,buffer,BUFFER_SIZE,0))

??? {

??? ??? if(length 0)

??? ??? {

??? ??? ??? printf("Recieve Data From Server %s Failed!\n", argv[1]);

??? ??? ??? break;

??? ??? }

//??? ??? int write_length = write(fp, buffer,length);

??? ??? int write_length = fwrite(buffer,sizeof(char),length,fp);

??? ??? if (write_lengthlength)

??? ??? {

??? ??? ??? printf("File:\t%s Write Failed\n", file_name);

??? ??? ??? break;

??? ??? }

??? ??? bzero(buffer,BUFFER_SIZE);???

??? }

??? printf("Recieve File:\t %s From Server[%s] Finished\n",file_name, argv[1]);

??? return 0;

}

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();?

????????}?

????}?

}

网络程序设计UDP客户端实验问题,不管怎么调试都出现recvfrom() Failed:10054,望解决,谢谢!

10054是“连接被重置”

你确定一下你发送数据包的目的端点是不是有在监听这个端口,如果没有,那么对方主机会发一个代表错误的数据包过来,然后你的recvfrom就失败了(返回-1)

(责任编辑:IT教学网)

更多

推荐网络工程师文章