You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

104 lines
2.8 KiB

#include "stm32f4xx_hal.h"
#include "lwip.h"
#include "udp.h"
#include "string.h"
#include "udpclient.h"
#include "socket.h"
#include "sockets.h"
#include "def.h"
/* 定义端口号 */
#define UDP_REMOTE_PORT 8881 /* 远端端口 */
#define UDP_LOCAL_PORT 8880 /* 本地端口 */
#define SERVER_FAMILY AF_INET
#define SOCKET_ERROR -1
#define BUFFER_SIZE 256 // 缓冲区大小
static char s_sendBuf[BUFFER_SIZE]; // 发送数据的缓冲区
static char s_receBuf[BUFFER_SIZE]; // 接收数据的缓冲区
SOCKET sock_Client = 0; // 客户端用于通信的Socket
static struct sockaddr_in addr_server;
static struct sockaddr_in addr_client;
static struct sockaddr_in sock;
socklen_t sock_len = sizeof(sock);
void config_server(struct sockaddr_in *addr_server)
{
addr_server->sin_family = SERVER_FAMILY;
addr_server->sin_port = htons(UDP_REMOTE_PORT);
addr_server->sin_addr.s_addr = htonl(INADDR_BROADCAST);
}
void config_client(struct sockaddr_in *addr_client)
{
addr_client->sin_family = AF_INET;
addr_client->sin_addr.s_addr = inet_addr("0.0.0.0");
addr_client->sin_port = htons(UDP_LOCAL_PORT);
}
void udp_client_send_string(char *pData)
{
memcpy(s_sendBuf, pData, strlen(pData));
if (sendto(sock_Client, s_sendBuf, strlen(pData), 0, (struct sockaddr *)&addr_server, sizeof(struct sockaddr_in)) == SOCKET_ERROR)
{
printf("send string error\n");
}
}
void udp_client_init(void)
{
// bool bOpt = true;
struct timeval tv = {0, 100000};
config_server(&addr_server);
config_client(&addr_client);
// 创建客户端用于通信的Socket
sock_Client = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (sock_Client == SOCKET_ERROR)
{
printf("create socket error...\n");
}
else
{
printf("create socket success!\n");
}
// /* 开启广播 */
// if (lwip_setsockopt(sock_Client, SOL_SOCKET, SO_BROADCAST, (char *)&bOpt, sizeof(bOpt)) == SOCKET_ERROR)
// {
// printf("enable broadcast error...\n");
// }
// else
// {
// printf("enable broadcast success!\n");
// }
/* 设置超时 */
if (lwip_setsockopt(sock_Client, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(tv)) == SOCKET_ERROR)
{
printf("enable receive timeout error...\n");
}
else
{
printf("enable receive timeout success!\n");
}
/* 绑定 */
if (bind(sock_Client, (struct sockaddr *)&addr_client, sizeof(addr_client)) == SOCKET_ERROR)
{
printf("Bind failed");
return;
}
}
void udp_client_recv(void)
{
int recv_datalen = recvfrom(sock_Client, s_receBuf, sizeof(s_receBuf), 0, (struct sockaddr *)&sock, &sock_len);
if (recv_datalen > 0)
{
udp_client_send_string(s_receBuf);
printf("datalen:%d,data:%s\r\n", recv_datalen, s_receBuf);
}
}