#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define LOCAL_IP "192.168.2.1"
#define LOCAL_PORT 6000
#define REMOTE_IP "192.168.2.10"
#define REMOTE_PORT 6000
int sockfd;
char getVersion[3]={0x02,0x01,0x47};
int udp_socket_create(void)
{
struct sockaddr_in localaddr;
// 创建socket
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd < 0) {
perror("socket creation failed");
exit(1);
}
// Filling server information
memset(&localaddr, 0, sizeof(localaddr));
localaddr.sin_family = AF_INET;
localaddr.sin_port = htons(LOCAL_PORT); // 指定发送端口
inet_pton(AF_INET, LOCAL_IP, &localaddr.sin_addr);
// 绑定socket到指定的发送端口
if (bind(sockfd, (const struct sockaddr *)&localaddr, sizeof(localaddr)) < 0) {
perror("bind failed");
exit(1);
}
}
int udp_socket_send(int port, char *data, int len)
{
struct sockaddr_in remoteaddr;
memset(&remoteaddr, 0, sizeof(remoteaddr));
remoteaddr.sin_family = AF_INET;
remoteaddr.sin_port = htons(port);
remoteaddr.sin_addr.s_addr = inet_addr(REMOTE_IP);
int ret = sendto(sockfd, data, len, 0, (const struct sockaddr*)&remoteaddr, sizeof(remoteaddr));
if (ret < 0) {
perror("sendto failed");
exit(EXIT_FAILURE);
}
}
int udp_socket_recv()
{
char recvbuf[128];
char ipbuf[16];
struct sockaddr_in cliaddr;
int len = sizeof(cliaddr);
// 接收数据
int num = recvfrom(sockfd, recvbuf, sizeof(recvbuf), 0, (struct sockaddr *)&cliaddr, &len);
printf("client IP : %s, Port : %d\n",
inet_ntop(AF_INET, &cliaddr.sin_addr.s_addr, ipbuf, sizeof(ipbuf)),
ntohs(cliaddr.sin_port));
printf("client say : %s\n", recvbuf);
}
int main(int argc, char *argv[]) {
if (argc != 2) {
printf("Usage: %s <IP> <port>\n", argv[0]);
exit(1);
}
udp_socket_create();
udp_socket_send(6000,getVersion,3);
printf("Message sent \n");
udp_socket_recv();
close(sockfd);
return 0;
}
UDP 数据发送以及接收
于 2024-05-08 17:00:32 首次发布