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++的keyword


{


   int socket_send(const char *IP);


   int socket_recv();


}


#endif// UDP_H


 


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


#include<stdio.h>


#include<string.h>


 


#ifdefMYLINUX


#include<sys/types.h>


#include<sys/socket.h>


#include<arpa/inet.h>


#include<unistd.h>


#defineSOCKET int


#else


#include<winsock2.h>


#endif


 


intsocket_send(const char *IP)


{


#ifndefMYLINUX


   //初始化socket


   DWORD ver;


   WSADATA wsaData;


   ver = MAKEWORD(1, 1);//在调用WSAStatrtup要告诉widnows,我用什么版本号的socket


   WSAStartup(ver, &wsaData);//windows要求,仅仅要用socket,第一步,必须调用这个函数


   //初始化socket完毕


#endif


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


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


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


   SOCKET 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));


 


   char buf[1024] = {0};


   size_t rc = 0;


   while(1)


   {


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


       gets(buf);


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


           break;


       //发送udp数据


       rc= sendto(st, buf, strlen(buf), 0, (struct sockaddr *)&addr, sizeof(addr));


   }


 


   #ifdef MYLINUX


   close(st);


#else


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


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


#endif


   return rc;


 


}


 


intsocket_recv()


{


#ifndefMYLINUX


   //初始化socket


   DWORD ver;


   WSADATA wsaData;


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


   ver = MAKEWORD(1, 1);


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


   WSAStartup(ver, &wsaData);


   //初始化socket完毕


#endif


 


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


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


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


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


   struct sockaddr_in addr;


   //初始化结构addr;


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


   //代表要使用一个TCP/IP的地址


   addr.sin_family = AF_INET;


   addr.sin_port = htons(8080);//host to net short


   //做为接收方,不须要指定详细的IP地址,接收的主机是什么IP,我就在什么IP上收数据


   addr.sin_addr.s_addr = htonl(INADDR_ANY);


   int rc = 0;


   //将port号和程序绑定


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


   {


       charbuf[1024] = {0};


       structsockaddr_in sendaddr;


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


 


#ifdefMYLINUX


       socklen_tlen;


#else


       intlen;


#endif


       len= sizeof(sendaddr);


       while(1)


       {


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


           //接收udp数据


           rc= recvfrom(st, buf, sizeof(buf), 0, (struct sockaddr *)&sendaddr, &len);


           //inet_ntoa(sendaddr.sin_addr);//这个函数是不可重入函数


           printf("%s:%s\n",inet_ntoa(sendaddr.sin_addr), buf);


       }


   }


#ifdefMYLINUX


close(st);


#else


   //使用完socket要将其关闭


   closesocket(st);


   //释放win socket内部的相关资源


   WSACleanup();


#endif


   return rc;


}


 

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]);//args[1]表示的是IP地址
}
else
{
//表示接收消息
socket_recv();
}
return 0;
}