Window下UDP(socket)接和收数据案例
Posted cxchanpin
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Window下UDP(socket)接和收数据案例相关的知识,希望对你有一定的参考价值。
-
配置QT的环境变量,这台电脑à属性à高级系统设置à高级à环境变量à系统变量àpathàC:\Qt\Qt5.3.0\5.3\mingw482_32\bin;C:\Qt\Qt5.3.0\Tools\QtCreator\bin
-
创建一个QT项目:winAndLinuxMyUdpProject项目
-
改动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++的keyword
{
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;
//将port号和程序绑定
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”keyword来说明。
C:在unix下so文件一定要以lib开头,以so结尾
以上是关于Window下UDP(socket)接和收数据案例的主要内容,如果未能解决你的问题,请参考以下文章
Linux客户端和Window服务器端udp socket通信不能成功