udp的socket是怎样实现数据传输

网络/协议

43人已加入

描述

     UDP简介

  UDP: User Datagram Protocol的简称, 中文名是用户数据包协议,是 OSI 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。

  特点:每个数据报中都给出了完整的地址信息,因此无需要建立发送方和接收方的连接。

  UDP传输数据时是有大小限制的,每个被传输的数据报必须限定在64KB之内。

  UDP是一个不可靠的协议,发送方所发送的数据报并不一定以相同的次序到达接收方。

     udp socket实现数据传输

  socket编程实现UDP数据传输基于DatagramSocket与DatagramPacketAPI实现。

  [java] view plain copy

  [java] view plain copyimport java.io.IOException;

  import java.net.DatagramPacket;

  import java.net.DatagramSocket;

  import java.net.InetAddress;

  /**

  * 客户端发送数据

  */

  public class UdpClient {

  public static void main(String[] args) throws IOException {

  // 1.定义服务器的地址、端口号、数据

  byte[] data = “udpclient发送数据”.getBytes();

  InetAddress address = InetAddress.getByName(“localhost”);

  int port = 8086;

  // 2.创建数据报,包含发送的数据信息

  DatagramPacket packet = new DatagramPacket(data, data.length, address,port);

  // 3.创建DatagramSocket对象

  DatagramSocket socket = new DatagramSocket();

  // 4.向服务器端发送数据报

  socket.send(packet);

  socket.close();

  }

  }

  [java] view plain copyimport java.io.IOException;

  import java.net.DatagramPacket;

  import java.net.DatagramSocket;

  /**

  *服务器接收数据

  */

  public class UdpServer {

  public static void main(String[] args) throws IOException {

  DatagramSocket socket = new DatagramSocket(8086);

  byte[] data = new byte[1024];

  DatagramPacket packet = new DatagramPacket(data, data.length);

  socket.receive(packet);

  String info = new String(data, 0, packet.getLength());

  System.out.println(“udpservice接收数据是” + info);

  socket.close();

  }

  }

  关于socket的配置:

  1、创建sokcet套接字

  2、为创建的socket绑定地址与端口,指定传输的协议,一般采用AF_INET,数据的传输格式一般为(SOCK_STREAM、SOCK_DGRAM)

  3、打开文件标识符,并开始发送数据

  udp客户端CODE:

  [cpp] view plain copy《pre name=“code” class=“html”》#include 《unistd.h》

  #include 《sys/types.h》

  #include 《netinet/in.h》

  #include 《arpa/inet.h》

  #include 《stdlib.h》

  #include 《stdio.h》

  #include 《errno.h》

  #include 《string.h》

  void client(int sock){

  //2、设置客户端socket参数

  struct sockaddr_in servaddr;

  memset(&servaddr, 0, sizeof(servaddr));

  //3、设置传输协议、端口以及目的地址

  servaddr.sin_family = AF_INET;

  servaddr.sin_port = htons(5188);

  servaddr.sin_addr.s_addr = inet_addr(“127.0.0.1”);

  //4、创建发送与接收缓存字节数组

  int ret;

  char sendbuf[1024] = {0};

  char recvbuf[1024] = {0};

  //5、开始发送数据(此处是发送来自标准输入的数据)

  while(fgets(sendbuf, sizeof(sendbuf), stdin) != NULL){

  sendto(sock, sendbuf, strlen(sendbuf), 0, (struct sockaddr *)&servaddr, sizeof(servaddr));

  //6、开始接收数据,接收服务端返回的数据

  ret = recvfrom(sock, recvbuf, sizeof(recvbuf), 0, NULL, NULL);

  if(ret == -1){

  perror(“recvfrom”);

  exit(EXIT_FAILURE);

  }

  //fputs(recvbuf, stdout); //将服务端返回的数据写入到标准输出

  //7、清空发送与接收缓存

  memset(sendbuf, 0, sizeof(sendbuf));

  memset(recvbuf, 0, sizeof(recvbuf));

  }

  //8、关闭socket流

  close(sock);

  }

  int main(void){

  int sock;

  //1.创建客户端的socket

  if((sock = socket(PF_INET, SOCK_DGRAM, 0)) 《 0){

  perror(“socket”);

  exit(EXIT_FAILURE);

  }

  client(sock);

  return 0;

  }

  UDP服务端CODE:

  [cpp] view plain copy#include 《stdio.h》

  #include 《stdlib.h》

  #include 《unistd.h》

  #include 《errno.h》

  #include 《sys/types.h》

  #include 《sys/socket.h》

  #include 《netinet/in.h》

  #include 《string.h》

  void server(int sock){

  //1、建立接收缓存字节数组

  char recvbuf[1024] = {0};

  //2、定义socket

  struct sockaddr_in peeraddr;

  socklen_t peerlen;

  int n;

  while(1){

  //

  peerlen = sizeof(peeraddr);

  //3、清空接收缓存数组

  memset(recvbuf, 0, sizeof(recvbuf));

  //4、开始接收数据

  n = recvfrom(sock, recvbuf, sizeof(recvbuf), 0, (struct sockaddr *)&peeraddr, &peerlen);

  //5、判断是否接收完整数据

  if(n == -1){

  perror(“recvfrom”);

  exit(EXIT_FAILURE);

  }else if(n 》 0){

  //6、成功接收数据,将缓存数据写入到标准输出,打印到控制台

  fputs(recvbuf, stdout);

  //7、想客户端回送接收到的数据(回显客户端输入的数据)

  sendto(sock, recvbuf, n, 0, (struct sockaddr *)&peeraddr, peerlen);

  }

  }

  //关闭socket

  close(sock);

  }

  int main(void){

  int sock;

  //创建服务器socket

  if((sock = socket(PF_INET, SOCK_DGRAM, 0)) 《 0){

  perror(“socket error”);

  exit(EXIT_FAILURE);

  }

  //设置服务器socket参数

  struct sockaddr_in servaddr;

  memset(&servaddr, 0, sizeof(servaddr));

  //设置socket的协议、端口以及地址

  servaddr.sin_family = AF_INET;

  servaddr.sin_port = htons(5188);

  servaddr.sin_addr.s_addr = htonl(INADDR_ANY);

  //将socket绑定地址

  if(bind(sock, (struct sockaddr *)&servaddr, sizeof(servaddr)) 《 0){

  perror(“bind error”);

  exit(EXIT_FAILURE);

  }

  server(sock);

  return 0;

  }

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分