UDP 数据发送以及接收

#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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值