-
配置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
#ifndef UDP_H
#define UDP_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>
#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
int socket_send(const char *IP)
{
#ifndef MYLINUX
//初始化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;
}
int socket_recv()
{
#ifndef MYLINUX
//初始化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)
{
char buf[1024] = {0};
struct sockaddr_in sendaddr;
memset(&sendaddr, 0, sizeof(sendaddr));
#ifdef MYLINUX
socklen_tlen;
#else
int len;
#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);
}
}
#ifdef MYLINUX
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;
}