ACE_linux:UDP通信

1.涉及类

ACE_INET_Addr//ACE网络地址
ACE_SOCK_Dgram//ACE报文

2.简介

UDP通信时无需像TCP那样建立连接和关闭连接,TCP编程时需要通过accept和connect来建立连接,而UDP通信省略了这一步骤,相对来说编程更为简单。

由于UDP通信时无建立连接,服务器端不能像TCP通信那样在建立连接的时候就获得客户端的地址信息,故服务器端不能主动对客户端发送信息(不知道客户端的地址),只有等到收到客户端发送的UDP信息时才能确定客户端的地址信息,从而进行通信。

UDP通信过程如下:

l 服务器端绑定一固定UDP端口,等待接收客户端的通信。

l 客户端通过服务器的ip和地址信息直接对服务器端发送消息。

l 服务器端收到客户端发送的消息后获取客户端的ip和端口信息,通过该地址信息和客户端通信。

3.示例代码

 1 #include <iostream>
 2 #include "ace/SOCK_Dgram.h"
 3 using namespace std;
 4
 5 const int  SERVER_PORT = 3000 ;
 6 int main(int argc, char *argv[])
 7 {
 8     char buffer[1024];
 9     ssize_t bc=0;            //接收的字节数
10     ACE_SOCK_Dgram  peer;//SOCK_IO,和客户端的数据通路
11     ACE_Time_Value timeout(100, 0);//TCP接受超时时间
12     ACE_INET_Addr remoteAddr;    //所连接的远程地址
13
14     //Socket创建,绑定,监听
15     ACE_INET_Addr addr(SERVER_PORT);
16     if(peer.open(addr) != 0)     //绑定端口
17     {
18         cout<<"bind port fail!"<<endl;
19         return -1;
20     }
21     cout<<"server ready. "<<endl;
22
23     while(true)
24     {
25         while(true)
26         {
27             //接收数据(超时或对端断开break)
28             if((bc=peer.recv(buffer,1024,remoteAddr,0,&timeout))<=0)
29             {
30                 break;
31             }
32             buffer[bc]=‘\0‘;
33             cout<<"[server rev]:>"<<buffer<<endl;
34             if(strcmp(buffer, "quit") == 0)
35             {
36                 break;
37             }
38
39             //发送数据
40             do
41             {
42                 cout<<"[server cin]:>";
43                 cin.getline(buffer,1024);
44             }while(strlen(buffer)<=0);
45             peer.send(buffer, strlen(buffer),remoteAddr,0,&timeout);
46         }
47     }
48     peer.close ();//UDP服务器用不到
49
50     return 0;
51 }

server.cpp

 1 #include <ace/SOCK_Dgram.h>
 2
 3 #include <string>
 4 #include <iostream>
 5 using namespace std;
 6
 7 const int  SERVER_PORT = 3000 ;
 8
 9 int main(int argc, char *argv[])
10 {
11     char buffer[1024];
12     ssize_t bc=0;            //接收的字节数
13
14     ACE_INET_Addr remoteAddr(SERVER_PORT,"192.168.237.128");
15     ACE_INET_Addr addr;
16     ACE_Time_Value timeout(100,0);
17     ACE_SOCK_Dgram  peer(addr);
18
19     cout<<"ready !"<<endl;
20
21     while(true)
22     {
23         //发送数据
24         do
25         {
26             cout<<"[client cin]:>";
27             cin.getline(buffer,1024);
28         }while(strlen(buffer)<=0);
29         peer.send(buffer, strlen(buffer),remoteAddr,0,&timeout);
30
31         //接收数据(超时或对端断开break)
32         if((bc=peer.recv(buffer,1024,remoteAddr,0,&timeout))<=0)
33         {
34             break;
35         }
36         buffer[bc]=‘\0‘;
37         cout<<"[client rev]:>"<<buffer<<endl;
38         if(strcmp(buffer, "quit") == 0)
39         {
40             break;
41         }
42     }
43     peer.close();
44
45     return 0;
46 }

client.cpp

ok!

时间: 2024-10-06 15:56:41

ACE_linux:UDP通信的相关文章

UDP通信

UDP通信的实体都是对等的. Server可以绑定端口,client实际上也可以绑定端口,如果不绑定端口,系统给socket随机关联一个端口. Client也可以通过Connect建立和server的连接. 例如: client绑定1900,server绑定1500 udp 0 0 0.0.0.0:1500 0.0.0.0:* udp 0 0 127.0.0.1:1900 127.0.0.1:1500 ESTABLISHED

wince 6.0下UDP通信需要注意MAC地址

最近在wince6.0下进行网络通信,在ARM下使用UDP通信协议.当然了,首先按照自己的使用配置wince中的IP,修改注册表即可. 我是wince的菜鸟,但是绝不是使用UDP通信的新手,在windows下跑过多次的UDP发送端和接收端,在wince下却怎么都不能像在windows下使用那么顺利,出现了不可理解的现象: (1)wince和wince相互通信,发送成功了,可是接收端却没有收到数据包: (2)wince和windows相互通信,发送和接收都正常: (3)wince和windows互

HP-SOCKET TCP/UDP通信框架库解析

项目概述: HP-SOCKET是一套通用TCP/UDP通信框架,包括服务器.客户端.Agent组件:其目标是提供高性能.通用性.简易性.可扩展.可定制: 鉴于此,其仅实现基本的通用框架通信.数据收发功能,供上层应用直接简单使用的接口实现:而对于数据包完整性和协议解析等未处理, 也就意味着需要应用层自己处理一些数据包构造或解析等操作: 事实上目前只能支持windows平台: 1. 对于TCP通信模式下:服务器端和Agent均采用的是异步IO模型中的完成端口模型,客户端采用的是就绪IO通告模型中的W

android udp通信(应用层与底层硬件的通信)

背景:最近项目用到一块工控板,板子硬件与上位机通过udp方式进行通信,但厂家只提供了c#的demo,并将相应的驱动命令封装为dll动态库.另一项目小组希望在android平台下也能驱动这块工控板,我之前写过一些底层的驱动,但都收通过串口来传输的,通过网络进行数据通信的还是头一次接触.简单地看了下硬件的通信协议,还好,不算很复杂,每条命令只有20个字节.于是开始了解在android下如何实现Udp通信,现积累如下. what? 字面意思:UDP的全称是 User Datagram Protocol

JAVA网络编程--UDP通信

首先网络传输数据需了解例如以下三点 1.找到对方IP 2.数据要发送到对方指定的应用程序上,为了标识这些应用程序,所以给这些网络应用程序用数字进行了标识.为了方便称呼这个数字,叫做port,逻辑port 3.  定义通信规则.这个通信规则称为协议. 国际组织定义了通用协议TCP/IP. 127.0.0.1本机回环地址 不易记忆,可用主机名 主机名:localhost 0-65535port范围 0-1024系统使用或保留port .当中mysql的port号为 3306 一.UDP UDP相对于

qt在windows下的udp通信(最简单)

qt编程:windows下的udp通信 本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明. 环境: 主机:win7 开发环境:qt 功能: 用udp进行收发通信 界面: 源代码: LssHost.pro: [cpp] view plain copy #------------------------------------------------- # # Project created by QtCreator 2013-09-22T09:36:44

Android 之简单UDP通信

一 Android UDP通信编程步骤 服务器端: 1.建立Socket 2.监听端口  3.接收数据  4.实现数据发送 客户端:直接实现数据发送即可 二 代码,实现一个简单的UdpHelper类 1 package com.br.delphi.centercontrol; 2 3 import android.os.Handler; 4 import android.os.Message; 5 import android.util.Log; 6 7 import java.io.IOExc

高性能 TCP &amp; UDP 通信框架 HP-Socket v3.5.1 正式发布

HP-Socket 是一套通用的高性能 TCP/UDP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++.C#.Delphi.E(易语言).Java.Python 等编程语言接口.HP-Socket 对通信层实现完全封装,应用程序不必关注通信层的任何细节:HP-Socket 提供基于事件通知模型的 API 接口,能非常简单高效地整合到新旧应用程序中. 为了让使用者能方便快速地学习和使用 HP-Socket,迅速掌握

[python] 网络编程之套接字Socket、TCP和UDP通信实例

很早以前研究过C#和C++的网络通信,参考我的文章: C#网络编程之Tcp实现客户端和服务器聊天 C#网络编程之套接字编程基础知识 C#网络编程之使用Socket类Send.Receive方法的同步通讯 Python网络编程也类似.同时最近找工作笔试面试考察Socket套接字.TCP\UDP区别比较多,所以这篇文章主要精简了<Python核心编程(第二版)>第16章内容.内容包括:服务器和客户端架构.套接字Socket.TCP\UDP通信实例和常见笔试考题. 最后希望文章对你有所帮助,如果有不