Window下UDP(socket)接和收数据案例



  1. 配置QT的环境变量,这台电脑à属性à高级系统设置à高级à环境变量à系统变量àpathàC:\Qt\Qt5.3.0\5.3\mingw482_32\bin;C:\Qt\Qt5.3.0\Tools\QtCreator\bin
  2. 创建一个QT项目:winAndLinuxMyUdpProject项目
  3. 修改QT的项目文件,修改winAndLinuxMyUdpProject.pro文件:

 

注意,这的的:LIBS+=
-lWs2_32  ##标示使用window下的Ws2_32.lib,-l表示要链接后面的库

4.编写头文件:udp.h

#ifndefUDP_H

#defineUDP_H

 

//明确的告诉C++编译器,这是一个用C语言编译的函数,你就不要把函数名

//转化为C++格式了

//因为C++的编译器位了方法的重载,会修改方法的名称,如果最终的文件时

//C++为后缀的,那么就不需要加上下面一句了

extern"C" //这里是C++的关键字

{

   intsocket_send(constchar*IP);

   intsocket_recv();

}

#endif//UDP_H

 

5.编写头文件的实现函数

#include<winsock2.h> //这里是windows下使用socket需要的文件

#include<stdio.h>

#include<string.h>

 

/*接收ip地址*/

intsocket_send(constchar*IP)

{

   //初始化socket

   DWORDver;

   WSADATAwsaData;

   //在调用WSAStatrtup要告诉windows,我用什么版本的socket

   ver=MAKEWORD(1,1);

   //windows要求,只要用socket,第一步必须调用这个函数

   WSAStartup(ver,&wsaData);

   //初始化socket完成

 

 

   //建立一个socket,第一个参数是指定socket要用那个协议,AF_INET

   //代表要用TCP/IP协议

   //第三个参数SOCK_DGRAM意思是要用UDP协议

   //第三个参数一般默认值填0

   SOCKETst=socket(AF_INET,SOCK_DGRAM,0);//定义一个socket

   structsockaddr_inaddr;

   memset(&addr,0,sizeof(addr));//初始化结构addr;

   addr.sin_family=AF_INET;//代表要使用一个TCP/IP的地址

   addr.sin_port=htons(8080);//hosttonetshort

   addr.sin_addr.s_addr=inet_addr(IP);

 

   charbuf[1024]={0};

   size_trc=0;

   while(1)

   {

       memset(buf,0,sizeof(buf));

       gets(buf);

       if(buf[0]=='0')//做为还原的退出条件

           break;

       //发送udp数据

       rc=sendto(st,buf,strlen(buf),0,(structsockaddr

                                         *)&addr,sizeof(addr));

   }

   closesocket(st);//使用完socket要将其关闭

   WSACleanup();//释放winsocket内部的相关资源

 

   returnrc;

}

 

intsocket_recv()

{

   //初始化socket

   DWORDver;

   WSADATAwsaData;

   //在调用WSAStatrtup要告诉widnows,我用什么版本的socket

   ver=MAKEWORD(1,1);

   //Windows要求,只要用Socket,第一步必须调用这个函数

   WSAStartup(ver,&wsaData);

   //初始化socket完成

 

   //建立一个socket,第一个参数是指定socket要用那个协议,AF_INET代表要用TCP/IP协议

   //第二个参数SOCK_DGRAM意思是要用UDP协议

   //第三个参数一般默认填0

   SOCKETst=socket(AF_INET,SOCK_DGRAM,0); //定义一个socket

   structsockaddr_inaddr;

   memset(&addr,0,sizeof(addr)); //初始化结构addr

   addr.sin_family=AF_INET;//代表要使用一个TCP/IP的地址

   addr.sin_port=htons(8080);//hosttonetshort

   addr.sin_addr.s_addr=htonl(INADDR_ANY);//做为接收方,不需要指定具体的IP地址,接收的主机是什么IP,我就在什么IP上收数据

   intrc=0;

   //将端口号和程序绑定

   if(bind(st,(structsockaddr*)&addr,sizeof(addr))>-1)

   {

       charbuf[1024]={0};

       structsockaddr_insendaddr;

       memset(&sendaddr,0,sizeof(sendaddr));

       intlen=sizeof(sendaddr);

 

       while(1)

       {

           memset(buf,0,sizeof(buf));

           //接收udp数据

           rc=recvfrom(st,buf,sizeof(buf),0,

                         (structsockaddr*)&sendaddr,&len);

           printf("%s\n",buf);

       }

   }

   closesocket(st);//使用完socket要将其关闭

   WSACleanup();  //释放win_socket内部的相关资源

 

   returnrc;

}

 
6.编写main.c
#include <iostream>
#include "udp.h"
 
using namespace std;
 
int main(int argc, char *args[])
{
    //这一句说明当参数的个数大于1的时候发送消息
    if (argc > 1) 
    {
        socket_send(args[1]);  //
    }
    else
{
    //表示接收消息
        socket_recv();
    }
 
    return 0;
}
 
7.运行项目,项目截图如下:
A:先打开cmd窗口用于接收,进入项目winAndLinuxMyUdpProject.exe所在位置:
G:\QT\build-winAndLinuxMyUdpProject-Desktop_Qt_5_3_0_MinGW_32bit-Debug\debug\  
  B:打开cmd窗口用于发送:
下面是接收窗口:

下面是发送窗口:

 
8.额外添加:
A:gcc编译过程:

B:对于C语言来讲,编译完成之后函数的名称不会改变,对于C++来讲,函数的名称发生改变,如果C代码中的函数,在C++中使用一定要用extern “C”关键字来说明。
    C:在unix下so文件一定要以lib开头,以so结尾
 
时间: 2024-09-13 18:14:43

Window下UDP(socket)接和收数据案例的相关文章

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

udp无法收数据什么问题

问题描述 udp无法收数据什么问题 两台电脑用交换机连和用网线直连有区别吗?用交换机连服务器端vc程序可以收udp,网线直连服务器端VC程序bind()不成功,但socket助手仍然可以正常收数- 解决方案 交换机走网络层,电脑都通过交换机交换数据.所以可以支持UDP等直连就没有.

python udp的问题,收不到服务器的返回数据

问题描述 python udp的问题,收不到服务器的返回数据 本来是做个dns解析程序,本地记录找不到的话再向别的服务器请求,但是现在只写了一部分,直接将来自客户端的请求转发给202.106.0.20,但是完全没反应,收不到服务器返回的数据报.求解答 import os import socket import threading #字典,用来存放域名-ip键值对 domain_ip={} #去掉域名字符串最后的换行符 def DelLastChar(str): str_list=list(st

MFC下socket的收到的数据是如何区别显示在不同的窗口中的呢,求大神们指导!

问题描述 MFC下socket的收到的数据是如何区别显示在不同的窗口中的呢,求大神们指导! MFC下socket的收到的数据是如何区别显示在不同的窗口中的呢,本人是MFC,小菜鸟!求大神们指导! 解决方案 收到数据了,自己按格式得到不同字段数据,然后就是操作窗口各个控件,把数据显示上去.

Docker容器网络下UDP协议的一个问题

最近在工作中遇到一个 docker 容器下 UDP 协议网络不通的问题,困扰了很久,也比较有意思,所以想写下来和大家分享. 我们有个应用是 UDP 协议的,部署上去发现无法工作,但是换成 TCP 协议是可以的(应用同时支持 UDP.TCP 协议,切换成 TCP 模式发现一切正常).虽然换成 TCP 能解决问题,但是我们还是想知道到底 UDP 协议在网络模式下为什么会出现这个问题,以防止后面其他 UDP 应用会有异常. 这个问题抽象出来是这样的:如果有 UDP 服务运行在主机上(或者运行在网络模型

c#socket双向通信,收不到服务器的反馈信息

问题描述 c#socket双向通信,收不到服务器的反馈信息 请问大神们:为什么c#socket通信时,同步的,客户端必须先收到服务器的应答,才开始发送数据,但是在服务器收到数据处理完后,反馈给客户端时为什么收不到了? 解决方案 服务器代码: namespace serverfile { public partial class Form1 : Form { string fileaddr = @"C:Documents and SettingsAdministrator桌面filetrserve

windows编程-windows下udp通信,我想传输int型数据数组,而不是char字符数组,怎么传输啊?

问题描述 windows下udp通信,我想传输int型数据数组,而不是char字符数组,怎么传输啊? 似乎sendto函数和recvfrom函数在windows下只能传输char数据或数组,对于int数据或是其他类型数据或结构体都不能传输,这个问题怎么解决啊?我想传输int型数组啊.. ?linux下可是什么类型都能传输啊... 下面是发送函数sendto和接受函数recvfrom的定义: C++系统声明 int PASCAL FAR sendto ( IN SOCKET s, IN const

线程-android中UDP socket通信的问题

问题描述 android中UDP socket通信的问题 我使用两个线程,一个用来发送 数据,一个用来接收数据,先开启接收数据线程,接收到数据之后然后回应给对方,但是发送一直停在SocketAddess s=pacakge.getSocketAddess这一步,pacakge是接收到的包.接收线程是这样的:while(true){ socket.receive(packge);}接收到包之后我开启发送线程就卡在上面 那步了,是不是 socket在处于阻塞状态时不能发送数据包啊? 解决方案 默认是

UDP socket 设置为的非阻塞模式

UDP socket 设置为的非阻塞模式 Len = recvfrom(SocketFD, szRecvBuf, sizeof(szRecvBuf), MSG_DONTWAIT, (struct sockaddr *)&SockAddr,&ScokAddrLen); UDP socket 设置为的阻塞模式 Len = recvfrom(SocketFD, szRecvBuf, sizeof(szRecvBuf), 0, (struct sockaddr *)&SockAddr,&a