udp socket(udpsocket编程)

      最后更新:2023-05-12 10:06

      TCP 和 UDP 在socket编程中的区别

      一、TCP与UDP的区别 基于连接与无连接对系统资源的要求(TCP较多,UDP少)UDP程序结构较简单流模式与数据报模式TCP保证数据正确性,UDP可能丢包TCP保证数据顺序,UDP不保证部分满足以下几点要求时,应该采用UDP 面向数据报方式 网络数据大多为短消息拥有大量Client对数据安全性无特殊要求网络负担非常重,但对响应速度要求高具体编程时的区别 socket()的参数不同UDP Server不需要调用listen和acceptUDP收发数据用sendto/recvfrom函数TCP:地址信息在connect/accept时确定UDP:在sendto/recvfrom函数中每次均 需指定地址信息 UDP:shutdown函数无效
      实现方法 以及API 不同。运用的地方不同。当然主要取决去二者的各自特点。1)TCP是面向连接的传输控制协议,而UDP提供了无连接的数据报服务; (2)TCP具有高可靠性,确保传输数据的正确性,不出现丢失或乱序;UDP在传输数据前不建立连接,不对数...
      TCP 和 UDP 在socket编程中的区别。 基于连接与无连接对系统资源的要求(TCP较多,UDP少)UDP程序结构较简单流模式与数据报模式TCP保证数据正确性,UDP可能丢包TCP保证数据顺序,UDP不保证部分满足以下几点要求时,应该采用UDP 面向数据报方式 网络数据大多为短消息拥有大量Client对数据安全性无特殊要求网络负担非常重,但对响应速度要求高具体编程时的区别 socket()的参数不同UDP Server不需要调用listen和acceptUDP收发数据用sendto/recvfrom函数TCP:地址信息在connect/accept时确定UDP:在sendto/recvfrom函数中每次均 需指定地址信息 UDP:shutdown函数无效
      实现方法 以及API 不同。运用的地方不同。当然主要取决去二者的各自特点。1)TCP是面向连接的传输控制协议,而UDP提供了无连接的数据报服务; (2)TCP具有高可靠性,确保传输数据的正确性,不出现丢失或乱序;UDP在传输数据前不建立连接,不对数据报进行检查与修改,无须等待对方的应答,所以会出现分组丢失、重复、乱序,应用程序需要负责传输可靠性方面的所有工作;(3)也正因为以上特征,UDP具有较好的实时性,工作效率较TCP协议高;(4)UDP段结构比TCP的段结构简单,因此网络开销也小。 具体二种协议没有好坏,只有适合,有时候二者结合,比如QQ就是两种协议都有,比如组播通信的时候只能用udp
      TCP 和 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通信步骤是什么?

      UDP 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;in_port_t sin_port;struct in_addr sin_addr;char sin_zero[8];};这里使用“08”作为服务程序的端口,使用“INADDR_ANY”作为绑定的IP地址即任何主机上的地址。(3)使用bind()把上面的socket和定义的IP地址和端口绑定。这里检查bind()是否执行成功,如果有错误就退出。这样可以防止服务程序重复运行的问题。(4)进入无限循环程序,使用recvfrom()进入等待状态,直到接收到客户程序发送的数据,就处理收到的数据,并向客户程序发送反馈。这里是直接把收到的数据发回给客户程序。2、udpserv.c程序内容:#include #include #include #include #include #include #define MAXLINE 80#define SERV_PORT 8888void do_echo(int sockfd, struct sockaddr *pcliaddr, socklen_t clilen){int n;socklen_t len;char mesg[MAXLINE];for(;;){len = clilen;/* waiting for receive data */n = recvfrom(sockfd, mesg, MAXLINE, 0, pcliaddr, &len);/* sent data back to client */sendto(sockfd, mesg, n, 0, pcliaddr, len);}}int main(void){int sockfd;struct sockaddr_in servaddr, cliaddr;sockfd = socket(AF_INET, SOCK_DGRAM, 0); /* create a socket *//* init servaddr */bzero(&servaddr, sizeof(servaddr));servaddr.sin_family = AF_INET;servaddr.sin_addr.s_addr = htonl(INADDR_ANY);servaddr.sin_port = htons(SERV_PORT);/* bind address and port to socket */if(bind(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) == -1){perror("bind error");exit(1);}do_echo(sockfd, (struct sockaddr *)&cliaddr, sizeof(cliaddr));return 0;}UDP Client程序1、编写UDP Client程序的步骤(1)初始化sockaddr_in结构的变量,并赋值。这里使用“8888”作为连接的服务程序的端口,从命令行参数读取IP地址,并且判断IP地址是否符合要求。(2)使用socket()来建立一个UDP socket,第二个参数为SOCK_DGRAM。(3)使用connect()来建立与服务程序的连接。与TCP协议不同,UDP的connect()并没有与服务程序三次握手。上面我们说了UDP是非连接的,实际上也可以是连接的。使用连接的UDP,kernel可以直接返回错误信息给用户程序,从而避免由于没有接收到数据而导致调用recvfrom()一直等待下去,看上去好像客户程序没有反应一样。(4)向服务程序发送数据,因为使用连接的UDP,所以使用write()来替代sendto()。这里的数据直接从标准输入读取用户输入。(5)接收服务程序发回的数据,同样使用read()来替代recvfrom()。(6)处理接收到的数据,这里是直接输出到标准输出上。2、udpclient.c程序内容:#include #include #include #include #include #include #include #include #define MAXLINE 80#define SERV_PORT 8888void do_cli(FILE *fp, int sockfd, struct sockaddr *pservaddr, socklen_t servlen){int n;char sendline[MAXLINE], recvline[MAXLINE + 1];/* connect to server */if(connect(sockfd, (struct sockaddr *)pservaddr, servlen) == -1){perror("connect error");exit(1);}while(fgets(sendline, MAXLINE, fp) != NULL){/* read a line and send to server */write(sockfd, sendline, strlen(sendline));/* receive data from server */n = read(sockfd, recvline, MAXLINE);if(n == -1){perror("read error");exit(1);}recvline[n] = 0; /* terminate string */fputs(recvline, stdout);}}int main(int argc, char **argv){int sockfd;struct sockaddr_in srvaddr;/* check args */if(argc != 2){printf("usage: udpclient n");exit(1);}/* init servaddr */bzero(&servaddr, sizeof(servaddr));servaddr.sin_family = AF_INET;servaddr.sin_port = htons(SERV_PORT);if(inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0){printf("[%s] is not a valid IPaddressn", argv[1]);exit(1);}sockfd = socket(AF_INET, SOCK_DGRAM, 0);do_cli(stdin, sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr));return 0;}运行例子程序1、编译例子程序使用如下命令来编译例子程序:gcc -Wall -o udpserv udpserv.cgcc -Wall -o udpclient udpclient.c编译完成生成了udpserv和udpclient两个可执行程序。2、运行UDP Server程序执行./udpserv &命令来启动服务程序。我们可以使用netstat -ln命令来观察服务程序绑定的IP地址和端口,部分输出信息如下:Active Internet connections (only servers)Proto Recv-Q Send-Q Local Address Foreign Address Statetcp 0 0 0.0.0.0:32768 0.0.0.0:* LISTENtcp 0 0 0.0.0.0:111 0.0.0.0:* LISTENtcp 0 0 0.0.0.0:6000 0.0.0.0:* LISTENtcp 0 0 127.0.0.1:631 0.0.0.0:* LISTENudp 0 0 0.0.0.0:32768 0.0.0.0:*udp 0 0 0.0.0.0:8888 0.0.0.0:*udp 0 0 0.0.0.0:111 0.0.0.0:*udp 0 0 0.0.0.0:882 0.0.0.0:*可以看到udp处有“0.0.0.0:8888”的内容,说明服务程序已经正常运行,可以接收主机上任何IP地址且端口为8888的数据。如果这时再执行./udpserv &命令,就会看到如下信息:bind error: Address already in use说明已经有一个服务程序在运行了。3、运行UDP Client程序执行./udpclient 127.0.0.1命令来启动客户程序,使用127.0.0.1来连接服务程序,执行效果如下:Hello, World!Hello, World!this is a testthis is a test^d输入的数据都正确从服务程序返回了,按ctrl+d可以结束输入,退出程序。如果服务程序没有启动,而执行客户程序,就会看到如下信息:$ ./udpclient 127.0.0.1testread error: Connection refused 说明指定的IP地址和端口没有服务程序绑定,客户程序就退出了。这就是使用connect()的好处,注意,这里错误信息是在向服务程序发送数据后收到的,而不是在调用connect()时。如果你使用tcpdump程序来抓包,会发现收到的是ICMP的错误信息。
      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 发送缓冲区 最大可以为多大

      socket是tcp还是udp

      SOCKET是API,TCP/UPD是通信协议,两个不是一个概念
      都可以 socket是网络套接字 它可以使用tcp和udp两种传输协议
      tcp/ip 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。 建立网络通信连接至少要一对端口号(socket)。socket本质是编程接口(API),对TCP/IP的封装,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口;HTTP是轿车,提供了封装或者显示数据的具体形式;Socket是发动机,提供了网络通信的能力。
      socket是tcp还是udp

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

          热门文章

          文章分类