1. 配置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
  1. 编写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++代码的更多相关文章

  1. 项目总结22:Java UDP Socket数据的发送和接收

    项目总结22:Java UDP Socket数据的发送和接收 1-先上demo 客户端(发送数据) package com.hs.pretest.udp; import java.io.IOExcep ...

  2. C#实现读取IPv6 UDP Socket数据,再发送出去

    C#实现读取IPv6 UDP Socket数据,再发送出去. 不知为何,黑框点一下就停止刷新了,再点一下,就继续刷新了. using System; using System.Collections. ...

  3. 07.深入浅出 Spring Boot - 数据访问之Mybatis(附代码下载)

    MyBatis 在Spring Boot应用非常广,非常强大的一个半自动的ORM框架. 代码下载:https://github.com/Jackson0714/study-spring-boot.gi ...

  4. php的数据访问和封装运用

    php数据访问: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://ww ...

  5. 解析大型.NET ERP系统数据访问 对象关系映射框架LLBL Gen Pro

    LLBL Gen Pro是一个为.NET开发人员设计的的对象关系映射(ORM)框架,与NHibernate,Entity Framework等框架一样,通过实体与数据表的映射,实现关系数据库持久化. ...

  6. ClownFish:比手写代码还快的通用数据访问层

    http://www.cnblogs.com/fish-li/archive/2012/07/17/ClownFish.html 阅读目录 开始 ClownFish是什么? 比手写代码还快的执行速度 ...

  7. delphi(假三层之数据访问层)(第一天)

    本论文主要是通过三天来讲解三层的结构,今天是第一天,先讲解一下delphi下的Models层,我主要封装了两个查询得到数据集的函数,主要是通过在表示层上创建的数数据集控件传递进来,通过业务逻辑对语句的 ...

  8. 如何在数据访问层上提高js的执行效率

    本文讲到的是如何从数据访问层面上提高JS 代码的执行效率.总的来讲有以下几条原则: 函数中读写局部变量总是最快的,而全局变量的读取则是最慢的: 尽可能地少用with 语句,因为它会增加with 语句以 ...

  9. ADO.NET 数据访问类查询、属性扩展

    今天,我首先在之前所做的人员管理系统的基础上,利用数据访问类进行了所有人员信息的查询. 主程序代码: List<Users> Ulist = new UsersData().Select( ...

随机推荐

  1. String,StringBuffer以及StringBuilder的差别

    1.定义: String:String 类代表字符串. Java 程序中的全部字符串字面值(如"abc" )都作为此类的实例实现. 字符串是常量:它们的值在创建之后不能更改. 字符 ...

  2. M3U8格式解说及实际应用分析

    M3U8有啥优点 ? 网上搜索了一下,大家众说纷纭,个人理解主要是能够做多码率的适配,依据网络带宽,client会选择一个适合自己码率的文件进行播放,保证视频流的流畅. 在IOS device和mac ...

  3. 设计模式10---设计模式之原型模式(Prototype)

    1.场景模式 考虑这样一个实际应用:订单处理系统 里面有一个保存订单的功能,当产品数量超过1000份以后,拆成两份订单,再超,那么就再拆.直到每份订单不超过1000为止,订单有两种,一个是个人订单,一 ...

  4. Follow your hear(跟着心走)

    端午三天的哈尔滨之旅已经over,非常开心真的非常开心.听了刘四风老师的"为爱开讲.我爱这世界"的论坛,尽管.这三天老师讲的不多.可是句句是精华.Follow your heart ...

  5. ArrayList实现借壳

    随着Collections工具: import java.util.ArrayList; import java.util.Collections; public class TTEST { publ ...

  6. C#中的关键字

    abstract event new struct as explicit null switch base extern object this bool false operator throw ...

  7. HDU 4951 Multiplication table 阅读题

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=4951 题意:给一个P进制的乘法表.行和列分别代表0~p-1,第i行第j*2+1和第j*2+2列代表的是第i ...

  8. 【原创】leetCodeOj --- Jump Game II 解题报告

    原题地址: https://oj.leetcode.com/problems/jump-game-ii/ 题目内容: Given an array of non-negative integers, ...

  9. Apache HTTP Server 与 Tomcat 的三种连接方式介绍(转)

    首先我们先介绍一下为什么要让 Apache 与 Tomcat 之间进行连接.事实上 Tomcat 本身已经提供了 HTTP 服务,该服务默认的端口是 8080,装好 tomcat 后通过 8080 端 ...

  10. [WPF]静态资源(StaticResource)和动态资源(DynamicResource)

    一.文章概述 本演示介绍WPF基本采用静态和动态的资源.而且两者都做一个简单的比较. 静态资源(StaticResource)指的是在程序加载内存时对资源的一次性使用,之后就不再訪问这个资源了:动态资 ...