udp socket(udp socket用固定端口发送数据)

      最后更新:2023-11-21 07:42

      UDP 和 TCP 的 socket 分别一般用在什么地方

      1.UDP是面向分组的,分组间有明确的边界;TCP是面向流字符的,数据流间无边界。 UDP发送一个分组,接收方或者接收完全失败,如果成功整个分组都会接收到。对于TCP,发送一串数字(1,2,3,4,5),接收时有可能变成两次(1,2)和(2,4,5),或者变成任意接收方式,协议栈只保证接收顺序正确。2.UDP属于非连接状态下的不可靠协议,实际运用中很少用到UDP,UDP对于网络资源消耗很少,可以用UDP进行nat穿透。TCP一般用于连接状态下的可靠的协议,比如http,telnet,smtp。3.TCP是可靠的,通过数据校验保证发送和接收到的数据是一致的;UDP是不可靠的,发送一串数字分组(1,2,3)可能接收到时就变成(1,0,0)了,做UDP连接时需要自己做数据校验。4.UDP是无序的,发出(1,2,3),有可能按照(1,3,2)的顺序收到,应用程序必须自己做分组排序;TCP数据是有序的,以什么顺序发送的数据,接收时同样会按照此顺序。5.TCP因为建立连接、释放连接、IP分组校验排序等需要额外工作,速度较UDP慢许多。TCP适合传输数据,UDP适合流媒体。 6.UDP比TCP更容易穿越路由器防火墙。
      UDP 和 TCP 的 socket 分别一般用在什么地方

      udp socket 关于在一个程序里实现发送和接收

      发送程序Sender.cpp: #include#include#include#includeusing namespace std;//创建新的套接字之前需要调用一个引入Ws2_32.dll库的函数,否则服务器和客户端连接不上#pragma comment(lib,"ws2_32.lib")struct test {string str;};struct UdpHeartPack {char UDPData[16] ;};int main(int argc, char* argv[]){struct UdpHeartPack udpPack;static int UDP_PORT = 7001;udpPack.UDPData[0] = 'h';udpPack.UDPData[1] = 'e';udpPack.UDPData[2] = 'l';udpPack.UDPData[3] = 'l';udpPack.UDPData[4] = 'o';udpPack.UDPData[5] = ' ';udpPack.UDPData[6] = 'w';udpPack.UDPData[7] = 'o';udpPack.UDPData[8] = 'r';udpPack.UDPData[9] = 'l';udpPack.UDPData[10] = 'd';udpPack.UDPData[11] = '';char *pPack = (char *) &udpPackWSADATA wsaData;//指向WinSocket信息结构的指针SOCKET sockListener;//创建套接字SOCKADDR_IN saUdpServ;//指向通信对象的结构体指针BOOL fBroadcast = TRUE; //用于setsockopt(),表示允许char sendBuff[800]; //缓冲区存放发送的数据int ncount=0; //用于显示消息数目//*************************** 第一步初始化Winsock *****************************//if(WSAStartup(MAKEWORD( 1, 1 ), &wsaData )!=0) //进行WinSocket的初始化{printf("Can't initiates windows socket!Program stop.n");//初始化失败返回-1return -1;}//******************** 第二步建立一个数据报类型的UDP套接字******************//sockListener=socket(PF_INET,SOCK_DGRAM,0);// setsockopt函数用于设置套接口选项// 采用广播形式须将第三个参数设置为SO_BROADCASTsetsockopt ( sockListener,SOL_SOCKET,SO_BROADCAST, (CHAR *)&fBroadcast, sizeof (BOOL) );//参数设置,注意要将IP地址设为INADDR_BROADCAST,表示发送广播UDP数据报saUdpServ.sin_family = AF_INET;saUdpServ.sin_addr.s_addr = htonl ( INADDR_BROADCAST );saUdpServ.sin_port = htons (UDP_PORT); //发送用的端口,可以根据需要更改while(1) //循环发送数据{Sleep(1000);sprintf(sendBuff,"Message %d is: ok",ncount++);//将ncount的值放入字符串senBuff中//**********************第三步使用sendto函数进行通信*************************//sendto ( sockListener,/*sendBuff*/pPack, lstrlen (sendBuff)/*sizeof(udpPack)*/, 0, (SOCKADDR *) &saUdpServ, sizeof (SOCKADDR_IN));printf("%sn",sendBuff);//将要广播的数据串输出}//********************* 第四步关闭socket***************************************//closesocket(sockListener); //关闭监听socketWSACleanup();return 0;}const static intBUFFER_LENGTH = 12;接收端程序Receiver.cpp:#include#include#include//创建新的套接字之前需要调用一个引入Ws2_32.dll库的函数,否则服务器和客户端连接不上#pragma comment(lib,"ws2_32.lib")int main(int argc, char* argv[]){WSADATA wsaData; //指向WinSocket信息结构的指针SOCKET sockListener;SOCKADDR_IN sin,saClient;//设置两个地址,sin用来绑定//saClient用来从广播地址接收消息char cRecvBuff[800]; //定义接收缓冲区int nSize,nbSize;int iAddrLen=sizeof(saClient);if(WSAStartup(MAKEWORD( 1, 1 ), &wsaData )!=0) //进行WinSocket的初始化{printf("Can't initiates windows socket!Program stop.n");//初始化失败返回-1return -1;}sockListener=socket(AF_INET, SOCK_DGRAM,0);sin.sin_family = AF_INET;sin.sin_port = htons(7001); //发送端使用的发送端口,可以根据需要更改sin.sin_addr.s_addr = htonl(INADDR_ANY);if(bind( sockListener, (SOCKADDR FAR *)&sin, sizeof(sin))!=0){printf("Can't bind socket to local port!Program stop.n");//初始化失败返回-1return -1;}while(1){nSize = sizeof ( SOCKADDR_IN );if((nbSize=recvfrom (sockListener,cRecvBuff,800,0,(SOCKADDR FAR *) &saClient,&nSize))==SOCKET_ERROR) //若接收失败则提示错误{printf("Recive Error");break;}cRecvBuff[nbSize] = '';//字符串终止printf("%sn",cRecvBuff);//显示所接收到的字符串}return 0; }
      udp socket 关于在一个程序里实现发送和接收

      通过udp socket如何传递自定义类对象

      1.定义类 定义类,implements Serializable 接口,但不用实现任何方法;发送和接收双方,进行类定义时,package 名 和 类名 必须一致如:package com.baggio.dhs.protocol;import Java.io.Serializable;public class PacketHead implements Serializable{/****/private static final long serialVersionUID = 1L;private byte start;private byte type;private short datalen;private int sender_address;private short serial_no;private short frame_count;private static short data_id=0;private byte subtype;private byte check_bit;public PacketHead(){}public PacketHead(byte type, byte subtype, short datalen){this.start=0x7F;this.type=type;this.datalen=datalen;this.sender_address=0;this.serial_no=0;this.frame_count=1;this.data_id++;this.subtype=subtype;this.check_bit=0;}public byte getType(){return type;}public PacketHead setType(byte type){this.type=type; return this;}public byte getSubtype(){return subtype;}public PacketHead setSubtype(byte subtype){this.subtype=subtype; return this;}public int getSenderAddress(){return sender_address;}public PacketHead setSenderAddress(int sender_address){this.sender_address=sender_address; return this;}}2.发送方,进行发送对象的序列化package com.baggio.dhs.protocol;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.ObjectOutputStream;import java.NET.DatagramPacket;import java.Net.DatagramSocket;import java.net.InetAddress;import java.net.SocketException;import java.net.UnknownHostException;public class SendObject{public static void main(String[] args){DatagramSocket dSocket = null;InetAddress local=null;try {local = InetAddress.getByName("192.168.1.89");} catch (UnknownHostException e) {e.printStackTrace();}try {dSocket = new DatagramSocket(6001);} catch (SocketException e) {e.printStackTrace();}PacketHead message=new PacketHead((byte)0x71, (byte)0x41, (short)0x00);ByteArrayOutputStream bout=new ByteArrayOutputStream();ObjectOutputStream oout = null;try {oout = new ObjectOutputStream(bout);oout.writeObject(message);oout.flush();} catch (IOException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}//序列化对象byte[] sendBuff=bout.toByteArray(); //转化为字节数组DatagramPacket dPacket=new DatagramPacket(sendBuff,sendBuff.length,local,24202);/*String message=new String("hello world");DatagramPacket dPacket=new DatagramPacket(message.getBytes(), message.length(), local, 24202);*/try {dSocket.send(dPacket);} catch (IOException e) {e.printStackTrace();}dSocket.close();System.out.println("Send success");}}3.接收方 ,进行反序列化,获得对象package com.baggio.dhs.protocol;。。。。。。。。mSocket.receive(packet);String fromIP=packet.getAddress().getHostAddress();int fromPort=packet.getPort();PacketHead message=new PacketHead();ByteArrayInputStream bint=new ByteArrayInputStream(recvBuff);ObjectInputStream oint=new ObjectInputStream(bint);message=(PacketHead)oint.readObject(); //反序列化,恢复对象 Log.i(MY_TAG, "type="+message.getType()+"subtype"+message.getSubtype());
      通过udp socket如何传递自定义类对象

      udp Socket 发送缓冲区 最大可以为多大

      发送缓冲区可以很大,但是在真正发送数据时需要分片发送。分片发送需要满足以下条件: 1、给每个udp包加上序号。2、校验字节每个udp包的最大大小是多少?65507 约等于 64K为什么最大是65507?因为udp包头有2个byte用于记录包体长度. 2个byte可表示最大值为: 2^16-1=64K-1=65535udp包头占8字节, ip包头占20字节, 65535-28 = 65507如果要发送的udp报文大于65507怎么办? 需要在应用层由开发者自己分片发送. 分片的粒度最大65507字节. 系统的sendto函数是不支持大于65507字节的单包发送的.
      udp Socket 发送缓冲区 最大可以为多大

      udp socket传输有延时吗

      有的, 一般是根据路由器的转发次数估测时延。北京到华盛顿和北京到上海,时延差距很大,这是因为转发次数太多的缘故。
      任何传输都是有网络上的时间消耗的。。 内核处理,调度消耗的时间。路上消耗的时间:距离/光速。内网的延迟大约 1ms 距离时间要看网络环境
      udp socket传输有延时吗

      本文由 在线网速测试 整理编辑,转载请注明出处。

          热门文章

          文章分类