转载

C++ UDP客户端服务器Socket编程

UDPServer.cpp

#include<winsock2.h>
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
#pragma comment(lib,"ws2_32.lib")
#define BUFFER_SIZE 1024
int main()
{
  WSADATA WSAData;
  char receBuf[BUFFER_SIZE];
  char Response[] = "";
  if (WSAStartup(MAKEWORD(2, 2), &WSAData) != 0)
  {
    printf("初始化失败");
    exit(1);
  }
  SOCKET sockServer = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
  if (sockServer == INVALID_SOCKET)
  {
    printf("Failed socket() \n");
    return 0;
  }
  SOCKADDR_IN addr_Server; //服务器的地址等信息
  addr_Server.sin_family = AF_INET;
  addr_Server.sin_port = htons(4567);
  addr_Server.sin_addr.S_un.S_addr = INADDR_ANY;
  if (bind(sockServer, (SOCKADDR*)&addr_Server, sizeof(addr_Server)) == SOCKET_ERROR)
  {
    //服务器与本地地址绑定
    printf("Failed socket() %d \n", WSAGetLastError());
    return 0;
  }
  SOCKADDR_IN addr_Clt;

  int fromlen = sizeof(SOCKADDR);
  while (true)
  {
    int last = recvfrom(sockServer, receBuf, 1024, 0, (SOCKADDR*)&addr_Clt, &fromlen);
    if (last>0)
    {
      //判断接收到的数据是否为空
      receBuf[last] = '\0';//给字符数组加一个'\0',表示结束了。不然输出有乱码
      if (strcmp(receBuf, "bye") == 0)
      {
        cout << " 客户端不跟我聊天了..." << endl;
        closesocket(sockServer);
        return 0;
      }
      else
      {
        printf("接收到数据(%s):%s\n", inet_ntoa(addr_Clt.sin_addr), receBuf);
      }
    }
    cout << "回复客户端消息:";
    cin >> Response; //给客户端回复消息
    sendto(sockServer, Response, strlen(Response), 0, (SOCKADDR*)&addr_Clt, sizeof(SOCKADDR));
  }

  closesocket(sockServer);

  WSACleanup();
  return 0;
}

UDPClient.cpp

#include<winsock2.h>
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
#pragma comment(lib,"ws2_32.lib")
# define BUFFER_SIZE 1024 //缓冲区大小
int main()
{
  SOCKET sock_Client; //客户端用于通信的Socket
  WSADATA WSAData;
  char receBuf[BUFFER_SIZE]; //发送数据的缓冲区
  char sendBuf[BUFFER_SIZE]; //接受数据的缓冲区

  if (WSAStartup(MAKEWORD(2, 2), &WSAData) != 0)
  {
    printf("初始化失败!");
    return -1;
  }

   //初始化
  sock_Client = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);//创建客户端用于通信的Socket
  SOCKADDR_IN addr_server; //服务器的地址数据结构
  addr_server.sin_family = AF_INET;
  addr_server.sin_port = htons(4567);//端口号为4567
  addr_server.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); //127.0.0.1为本电脑IP地址
  SOCKADDR_IN sock;
  int len = sizeof(sock);
  while (true)
  {
    cout << "请输入要传送的数据:";
    cin >> sendBuf;
    sendto(sock_Client, sendBuf, strlen(sendBuf), 0, (SOCKADDR*)&addr_server, sizeof(SOCKADDR));
    //int last=recv(sock_Client, receBuf, strlen(receBuf), 0); // (调用recv和recvfrom都可以)
    int last = recvfrom(sock_Client, receBuf, strlen(receBuf), 0, (SOCKADDR*)&sock, &len);
    if (last>0)
    {
      receBuf[last] = '\0'; //给字符数组加一个'\0',表示结束了。不然输出有乱码
      if (strcmp(receBuf, "bye") == 0)
      {
        cout << "服务器不跟我聊天了..." << endl;//当服务器发来bye时,关闭socket
        closesocket(sock_Client);
        break;
      }
      else
      {
        printf("接收到数据:%s\n", receBuf);
      }

    }

  }
  closesocket(sock_Client);
  WSACleanup();

  return 0;
}

windows下网络编程UDP的更多相关文章

  1. windows下网络编程TCP

    转载 sockets(套接字)编程有三种,流式套接字(SOCK_STREAM),数据报套接字(SOCK_DGRAM),原始套接字(SOCK_RAW): 基于TCP的socket编程 服务器端编程的步骤 ...

  2. 初尝Windows 下批处理编程

    本文叫“ 初尝Windows 下批处理编程”是为了延续上一篇“初尝 Perl”,其实对于博主而言批处理以及批处理编程早就接触过了. 本文包括以下内容 1.什么是批处理 2.常用批处理命令 3.简介批处 ...

  3. c/c++ 网络编程 UDP 用if_nameindex和ioctl取得主机网络信息

    网络编程 UDP 用if_nameindex和ioctl取得主机网络信息 getifaddrs函数取得的东西太多了,如果只想取得网卡名字和网卡编号可以用下面的2个函数. 1,if_nameindex ...

  4. c/c++ 网络编程 UDP 设定MTU

    网络编程 UDP 设定MTU MTU(Maximun Transmisson Unit):一次送信的最大size. 在程序里动态改变MTU.注意:程序运行需要root权限. 程序运行的方法: sudo ...

  5. c/c++ 网络编程 UDP up/down 网卡

    网络编程 UDP up/down 网卡 在程序里动态改变网卡的状态.注意:程序运行需要root权限. 程序运行的方法: sudo ./a.out 1,关闭网卡 #include <stdio.h ...

  6. c/c++ 网络编程 UDP 改变网关和网卡名字

    网络编程 UDP 改变网关和网卡名字 在程序里动态改变网关和网卡名字 1,改变网卡名字 #include <stdio.h> #include <string.h> #incl ...

  7. c/c++ 网络编程 UDP 改变网卡的硬件地址

    网络编程 UDP 改变网卡的硬件地址 在程序里动态改变网卡的硬件地址 1,取得网卡的硬件地址 #include <stdio.h> #include <string.h> #i ...

  8. c/c++ 网络编程 UDP 改变IP地址

    网络编程 UDP 改变IP地址 在程序里动态改变主机的IP地址 1,改变ipv4的地址 #include <stdio.h> #include <string.h> #incl ...

  9. c/c++ 网络编程 UDP 主机网络信息取得

    网络编程 UDP 主机网络信息取得 1,if_nametoindex 通过网卡名字取得网卡编号 2,if_indextoname 通过网卡编号取得网卡名字 #include <stdio.h&g ...

随机推荐

  1. 自己实现的TypeOf函数2

    自己实现的typeOf函数:返回传入参数的类型 主要用于解决,js自带的typeof返回结果不精确:Ext JS中typeOf对字符串对象.元素节点.文本节点.空白文本节点判断并不准确的问题 与上一篇 ...

  2. element表格添加查看操作

    表格代码:黄色部分关键代码 首先看效果: <el-table :data="tableData" border height="480" style=&q ...

  3. Python数据处理与计算——概述

    Python是一种面向对象的,动态的程序设计语言,具有非常简洁而清晰的语法,适合于完成各种高层任务.它既可以用来快速开发程序脚本,也可以用来开发大规模的软件. 随着NumPy.SciPy.Matplo ...

  4. appium入门元素识别参考

    https://www.cnblogs.com/miniren/p/7365885.html#top

  5. 使用pyton在本地指定目录模拟服务器

    1.cd 到指定目录 2.运行命令 python 3之前 python -m SimpleHTTPServer & python 3+ python -m http.server & ...

  6. Neo4j 全文检索

    全文检索基本概念 搜索 搜索这个行为是用户与搜索引擎的一次交互过程,用户需要找一些数据,他提供给搜索引擎一些约束条件.搜索引擎通过约束条件抽取一些结果给用户 搜索引擎 搜索引擎存在的目的是存储,查找和 ...

  7. 智表(ZCELL)专业版收费说明

    一.产品收费方式1.智表专业版按照部署地址授权.(IP或域名均可)2.不同版本单独计价,升级时需要补差价+升级服务费30元. 二.产品价格1.当前智表专业版最新版本为 V1.5版本,价格与上一版本相同 ...

  8. OSI模型网络七层协议

    物理层 物理层是OSI的第一层,它虽然处于最底层,却是整个开放系统的基础.物理层为设备之间的数据通信提供传输媒体及互连设备,为数据传输提供可靠的环境. 1.1媒体和互连设备 物理层的媒体包括架空明线. ...

  9. 【alpha阶段】第十次Scrum Meeting

    每日任务内容 队员 昨日完成任务 明日要完成的任务 牛宇航 #26 评价总览接口编写https://github.com/rRetr0Git/rateMyCourse/issues/26 alpha阶 ...

  10. 译注(3): NULL-计算机科学上最糟糕的失误

    原文:the worst mistake of computer science 注释:有些术语不知道怎么翻译,根据自己理解的意思翻译了,如有不妥,敬请提出:) 致谢: @vertextao @fra ...