UDP(socket)数据访问和封装情况C++代码
配置QT下的pro文件
TEMPLATE = app
CONFIG += console
CONFIG -= app_bundle
CONFIG -= qt
LIBS += -lWs2_32 ##标示使用window下的Ws2_32.lib,-l表示要链接后面的库
#-lWs2_32,link Ws2_32.lib
SOURCES += main.cpp \
udp.cpp
HEADERS += \
udp.h
编写udp.h文件
#ifndef
UDP_H
#define
UDP_H
#ifdef
MYLINUX
#include
<sys/types.h>
#include
<sys/socket.h>
#include
<arpa/inet.h>
#include
<unistd.h>
#define
SOCKET
int
#else
#include
<winsock2.h>
#endif
class
myudp
{
private:
SOCKET
st;//类的内部成员通常是不暴露在类外部的
public:
myudp();
myudp(const
myudp
&it);
~myudp();
int
socket_bind(short
int
port);
int
socket_send(const
char
*IP,
const char
*buf,
int len);
int
socket_recv(char
*buf,
int len,
char *srcIP);
};
#endif
//
UDP_H
3.编写udp.cpp
#include <stdio.h>
#include <string.h>
#include "udp.h"
int myudp::socket_send(const char *IP, const char *buf, int len)
{
//建立一个socket,第一个參数是指定socket要用那个协议,AF_INET代表要用TCP/IP协议
//第二个參数SOCK_DGRAM意思是要用UDP协议
//第三个參数一般默认填0
st = socket(AF_INET, SOCK_DGRAM, 0);//定义一个socket
struct sockaddr_in addr;
memset(&addr, 0, sizeof(addr));//初始化结构addr;
addr.sin_family = AF_INET;//代表要使用一个TCP/IP的地址
addr.sin_port = htons(8080);//host to net short
addr.sin_addr.s_addr = inet_addr(IP);
//unsigned long laddr = inet_addr("192.168.6.200");
//unsigned char *p = &laddr;
//printf("%u,%u,%u,%u\n", *(p), *(p + 1),*(p + 2), *(p + 3));
size_t rc = 0;
//发送udp数据
rc = sendto(st, buf, len, 0, (struct sockaddr *)&addr, sizeof(addr));
return rc;
}
int myudp::socket_recv(char *buf, int len, char *srcIP)
{
struct sockaddr_in sendaddr;
memset(&sendaddr, 0, sizeof(sendaddr));
#ifdef MYLINUX
socklen_t addrlen;
#else
int addrlen;
#endif
addrlen = sizeof(sendaddr);
memset(buf, 0, len);
//接收udp数据
size_t rc = recvfrom(st, buf, len, 0, (struct sockaddr *)&sendaddr, &addrlen);
//inet_ntoa(sendaddr.sin_addr);//这个函数是不可重入函数
if (srcIP)
strcpy(srcIP, inet_ntoa(sendaddr.sin_addr));
return rc;
}
myudp::myudp()
{
#ifndef MYLINUX
//初始化socket
DWORD ver;
WSADATA wsaData;
ver = MAKEWORD(1, 1);//在调用WSAStatrtup要告诉widnows,我用什么版本号的socket
WSAStartup(ver, &wsaData);//windows要求,仅仅要用socket,第一步。必须调用这个函数
//初始化socket完毕
//建立一个socket,第一个參数是指定socket要用那个协议,AF_INET代表要用TCP/IP协议
//第二个參数SOCK_DGRAM意思是要用UDP协议
//第三个參数一般默认填0
st = socket(AF_INET, SOCK_DGRAM, 0);//定义一个socket
#endif
}
myudp::myudp(const myudp &it)
{
}
myudp::~myudp()
{
#ifdef MYLINUX
close(st);
#else
closesocket(st);//使用完socket要将其关闭
WSACleanup();//释放win socket内部的相关资源
#endif
}
int myudp::socket_bind(short port)
{
struct sockaddr_in addr;
//初始化结构addr;
memset(&addr, 0, sizeof(addr));
//代表要使用一个TCP/IP的地址
addr.sin_family = AF_INET;
//host to net short
addr.sin_port = htons(port);
//做为接收方,不须要指定详细的IP地址,接收的主机是什么IP,我就在什么IP上收数据
addr.sin_addr.s_addr = htonl(INADDR_ANY);
int rc = 0;
return bind(st, (struct sockaddr *)&addr, sizeof(addr));
}
4.main.c的实现代码
#include <iostream>
#include "udp.h"
using namespace std;
int main(int argc, char *args[])
{
if (argc > 1)
{
myudp udp;
char buf[1024] = {0};
while(1)
{
memset(buf, 0, sizeof(buf));
gets(buf);
udp.socket_send(args[1], buf, strlen(buf));
if (strncmp(buf, "exit", 4) == 0)
break;
}
}
else
{
myudp udp;
char buf[1024] = {0};
if (udp.socket_bind(8080) > -1)
{
char ip[100] = {0};
while(1)
{
memset(buf, 0, sizeof(buf));
memset(ip, 0, sizeof(ip));
udp.socket_recv(buf, sizeof(buf), ip);
if (strncmp(buf, "exit", 4) == 0)
break;
cout << buf << endl;
cout << ip << endl;
}
}
}
cout << "over" << endl;
return 0;
}
版权声明:本文博主原创文章,博客,未经同意不得转载。
UDP(socket)数据访问和封装情况C++代码的更多相关文章
- 项目总结22:Java UDP Socket数据的发送和接收
项目总结22:Java UDP Socket数据的发送和接收 1-先上demo 客户端(发送数据) package com.hs.pretest.udp; import java.io.IOExcep ...
- C#实现读取IPv6 UDP Socket数据,再发送出去
C#实现读取IPv6 UDP Socket数据,再发送出去. 不知为何,黑框点一下就停止刷新了,再点一下,就继续刷新了. using System; using System.Collections. ...
- 07.深入浅出 Spring Boot - 数据访问之Mybatis(附代码下载)
MyBatis 在Spring Boot应用非常广,非常强大的一个半自动的ORM框架. 代码下载:https://github.com/Jackson0714/study-spring-boot.gi ...
- php的数据访问和封装运用
php数据访问: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://ww ...
- 解析大型.NET ERP系统数据访问 对象关系映射框架LLBL Gen Pro
LLBL Gen Pro是一个为.NET开发人员设计的的对象关系映射(ORM)框架,与NHibernate,Entity Framework等框架一样,通过实体与数据表的映射,实现关系数据库持久化. ...
- ClownFish:比手写代码还快的通用数据访问层
http://www.cnblogs.com/fish-li/archive/2012/07/17/ClownFish.html 阅读目录 开始 ClownFish是什么? 比手写代码还快的执行速度 ...
- delphi(假三层之数据访问层)(第一天)
本论文主要是通过三天来讲解三层的结构,今天是第一天,先讲解一下delphi下的Models层,我主要封装了两个查询得到数据集的函数,主要是通过在表示层上创建的数数据集控件传递进来,通过业务逻辑对语句的 ...
- 如何在数据访问层上提高js的执行效率
本文讲到的是如何从数据访问层面上提高JS 代码的执行效率.总的来讲有以下几条原则: 函数中读写局部变量总是最快的,而全局变量的读取则是最慢的: 尽可能地少用with 语句,因为它会增加with 语句以 ...
- ADO.NET 数据访问类查询、属性扩展
今天,我首先在之前所做的人员管理系统的基础上,利用数据访问类进行了所有人员信息的查询. 主程序代码: List<Users> Ulist = new UsersData().Select( ...
随机推荐
- ACM/ICPM2014鞍山现场赛D Galaxy (HDU 5073)
题目链接:pid=5073">http://acm.hdu.edu.cn/showproblem.php?pid=5073 题意:给定一条线上的点,然后能够去掉当中的m个,使剩下的到重 ...
- 全面认识Eclipse中JVM内存设置(转)
这里向大家描述一下Eclipse中如何进行JVM内存设置,JVM主要管理两种类型的内存:堆和非堆.简单来说堆就是Java代码可及的内存,是留给开发人员使用的:非堆就是JVM留给自己用的,所以方法区.J ...
- Yii/Yii2:查询返回以某特定列为索引(键)的数组
在Yii1.x中,要想查询语句返回以特定列为键(key)的数组数据,代码例如以下(下述样例以表主键为返回数组索引): $users = User::model()->findAll(array( ...
- hdu1507最大匹配
题意:给出n*m的矩阵方块,某些方块是ponds,这些方块不能出售,然后能出售的是1*2的方块 要求求出有多少块1*2的方块能够出售,并输出这些方块的坐标(specia judge) 关键是怎么建出二 ...
- HP服务器更换主板前后的注意事项
问题 X86服务器免不了会出现故障,以我们实验室使用的HP服务器为例,已经有几台因为各种故障更换过主板了,更换主板前后有些事情需要我们应该注意或处理, 这里记录如下,其中第二.三点是针对我们所使用的C ...
- vim ---- 自己主动的按钮indent该命令
当使用vim一段代码的副本到一个程序时,有,经常indent会有一些问题. . 下面的这个强大的命令,使您可以一键码具有很好的格式. gg=G 样品:
- 【网络可靠版】Extjs4 Treegrid 使用实例
最近调试EXTJS 4的treegrid实例,看了很多水友的文章,以及官方的demo, 没一个可靠的,全都无法显示出来.像对于我们习惯用C++的coder来说,EXTJS简直就是一群无政府土匪来维护的 ...
- 初识google多语言通信框架gRPC系列(二)编译gRPC
目录 一.概述 二.编译gRPC 三.C#中使用gRPC 四.C++中使用gRPC 无论通过哪种语言调用gRPC,都必须要编译gRPC,因为生成proto访问类时,除了产生标准的数据定义类之外,还需要 ...
- HDOJ 2665 Kth number
静态区间第K小....划分树裸题 Kth number Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K ( ...
- ICTCLAS用的字Lucene4.9捆绑
它一直喜欢的搜索方向,虽然无法做到.但仍保持了狂热的份额.记得那个夏天.这间实验室.这一群人,一切都随风而逝.踏上新征程.我以前没有自己.面对七三分技术的商业环境,我选择了沉淀.社会是一个大机器,我们 ...