用udp协议通讯示例

一、绪言

udp是一种面向非连接,不可靠的通讯协议,相对于tcp来说,虽然可靠性不及,但传输效率较高。所以在网络上仍有很大的用途。这几日需要了解下udp通讯的过程,上网发现这方面的资料还挺少。于是仔细的翻找了下msdn,基本上搞清楚了udp通讯的过程。做了一个测试的例子。希望对大家有帮助。

二、udp的通讯过程

server端: open a socket(socket)--->name the socket(bind)--->send and receive data(sendto recvfrom)--->close socket(closesocket)

client端: open a socket(socket)---------------------------->send and receive data(sendto recvfrom)--->close socket(closesocket)

server端无需listen,client端无需connect,因此udp中server和client的区别相对较模糊。只要调用sendto和recvfrom就可以给指定的地址收发数据,但并不保证收发的数据的完整性和可靠性。

三、示例

udpserver主要代码:

void main()
{
  SOCKET socket1;
  InitWinsock();
  struct sockaddr_in local;
  struct sockaddr_in from;
  int fromlen =sizeof(from);
  local.sin_family=AF_INET;
  local.sin_port=htons(1000); ///监听端口
  local.sin_addr.s_addr=INADDR_ANY; ///本机
  socket1=socket(AF_INET,SOCK_DGRAM,0);
  bind(socket1,(struct sockaddr*)&local,sizeof local);
  while (1)
  {
    char buffer[1024]="\0";
    printf("waiting for message from others-------------\n");
    if (recvfrom(socket1,buffer,sizeof buffer,0,(struct sockaddr*)&from,&fromlen)!=SOCKET_ERROR)
    {
      printf("Received datagram from %s--%s\n",inet_ntoa(from.sin_addr),buffer);
      ////给cilent发信息
      sendto(socket1,buffer,sizeof buffer,0,(struct sockaddr*)&from,fromlen);
    }
    Sleep(500);
  }
  closesocket(socket1);
}
udpcilent主要代码: void main()
{
  SOCKET socket1;
  InitWinsock();
  struct sockaddr_in server;
  int len =sizeof(server);
  server.sin_family=AF_INET;
  server.sin_port=htons(1000); ///server的监听端口
  server.sin_addr.s_addr=inet_addr("168.168.0.10"); ///server的地址
  socket1=socket(AF_INET,SOCK_DGRAM,0);
  while (1)
  {
    char buffer[1024]="\0";
    printf("input message\n");
    scanf("%s",buffer);
    if (strcmp(buffer,"bye")==0)
      break;
    if (sendto(socket1,buffer,sizeof buffer,0,(struct sockaddr*)&server,len)!=SOCKET_ERROR)
    {
      if (recvfrom(socket1,
                    buffer,
                    sizeof buffer,
                    0,
                    (struct sockaddr*)&server,&len) != SOCKET_ERROR)
        printf("rece from server:%s\n",buffer);
    }
  }
  closesocket(socket1);
}

四、结束语

udp通讯比tcp简单了很多,在数据可靠性不是很高的情况下,有使用的价值。

本文配套源码

时间: 2024-09-11 23:56:03

用udp协议通讯示例的相关文章

C语言udp协议,局域网下,这两段代码为什么不能通讯?

问题描述 C语言udp协议,局域网下,这两段代码为什么不能通讯? client.c 发送消息 #include<stdio.h> #include<sys/types.h> #include<sys/socket.h> #include<netinet/in.h> #include<arpa/inet.h> #include<errno.h> #include<unistd.h> #include<sys/wait.

golang实现简单的udp协议服务端与客户端示例_Golang

本文实例讲述了golang实现简单的udp协议服务端与客户端.分享给大家供大家参考,具体如下: 其实udp没有什么服务端和客户端的概念了,只是一个发一个收而已,只是这样较方便能识别和理解. 服务端: 复制代码 代码如下: package main import (     "fmt"     "net" ) func main() {     // 创建监听     socket, err := net.ListenUDP("udp4", &am

网络协议基础知识 SMTP协议和UDP协议

SMTP协议的命令和应答 从前面的通讯模型可以看出SMTP协议在发送SMTP和接收SMTP之间的会话是靠发送SMTP的SMTP命令和接收SMTP反馈的应答来完成的.在通讯链路建立后,发送SMTP发送MAIL命令指令邮件发送者,若接收SMTP此时可以接收邮件则作出OK的应答,然后发送SMTP继续发出RCPT命令以确认邮件是否收到,如果接收到就作出OK的应答,否则就发出拒绝接收应答,但这并不会对整个邮件操作造成影响.双方如此反复多次,直至邮件处理完毕.SMTP协议共包含10个SMTP命令,列表如下:

网络协议基础知识:SMTP协议和UDP协议

SMTP协议的命令和应答 从前面的通讯模型可以看出SMTP协议在发送SMTP和接收SMTP之间的会话是靠发送SMTP的SMTP命令和接收SMTP反馈的应答来完成的.在通讯链路建立后,发送SMTP发送MAIL命令指令邮件发送者,若接收SMTP此时可以接收邮件则作出OK的应答,然后发送SMTP继续发出RCPT命令以确认邮件是否收到,如果接收到就作出OK的应答,否则就发出拒绝接收应答,但这并不会对整个邮件操作造成影响.双方如此反复多次,直至邮件处理完毕.SMTP协议共包含10个SMTP命令,列表如下:

Java基于socket服务实现UDP协议的方法

  本文实例讲述了Java基于socket服务实现UDP协议的方法.分享给大家供大家参考.具体如下: 示例1: 接收类: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 package com.socket.demo; import java.io.IOException; import java.net.DatagramPacket; import java.net

计算机网络课设之基于UDP协议的简易聊天机器人

前言:2017年6月份计算机网络的课设任务,在同学的帮助和自学下基本搞懂了,基于UDP协议的基本聊天的实现方法.实现起来很简单,原理也很简单,主要是由于老师必须要求使用C语言来写,所以特别麻烦,而且C语言的socket编程我基本没有接触过,顶多对java网络编程有一点涉猎.下面我将自己所学的知识做了一个总结,希望可以对想要去接触socket(网络)编程的同学有一个帮助,当然想要学好网络编程肯定是离不开几本书的支撑的,这篇文章主要通过一个机器人聊天的案例帮大家入下门. 注意:想要成功运行的前提条件

udp socket-.Net UDP Socket 通讯时 如何实现客户端连续发信息或服务端连续发信息

问题描述 .Net UDP Socket 通讯时 如何实现客户端连续发信息或服务端连续发信息 本人是新手,写了 C# 的UDP SOcket 通讯程序,目前只实现了 客户端向服务端发送消息,服务端收到消息后回复消息,而 不能实现客户端连续向服务端发消息,服务端连续回复消息. 在查找资料说要使用多线程,但是我不懂,请求高手指导.代码如下: Client: private void btSendMsg_Click(object sender, EventArgs e) { byte[] data =

做聊天功能,单纯使用UDP协议成功率低怎么办?

问题描述 情况是这样的,现在写了一个类似于聊天程序.用纯UDP协议处理,成功率太低,(前期想做UDP穿透,让两端直接通讯.但是因为两端都可能会用GPRS网络所以放弃了,此路不通)服务器:公网IP(Linux系统,写了一个转发.数据库存储的程序).客户端:Android客户端,三个线程一个接受.一个发送.一个心跳原本做法:客户端发送一次UDP消息,超过5秒对方无回应则提示超时.成功率很低...(50%左右超时)现在改善一点:客户端发送三次(每三秒),如12秒后没收到回应则认为超时成功率略有提高但是

Linux网络编程之UDP Socket程序示例_C 语言

在网络传输协议中,TCP协议提供的是一种可靠的,复杂的,面向连接的数据流(SOCK_STREAM)传输服务,它通过三段式握手过程建立连接.TCP有一种"重传确认"机制,即接收端收到数据后要发出一个肯定确认的信号,发送端如果收到接收端肯定确认的信号,就会继续发送其他的数据,如果没有,它就会重新发送. 相对而言,UDP协议则是一种无连接的,不可靠的数据报(SOCK_DGRAM)传输服务.使用UDP套接口不用建立连接,服务端在调用socket()生成一个套接字并调用bind()绑定端口后就可