C语言实现UDP通信

UDP(User Datagram Protocol)是一种无连接的传输层协议,提供面向事务和不可靠的数据包传输服务。C语言可以通过socket编程实现UDP通信。下面是一个简单的C语言程序示例,使用socket编程实现UDP通信。

发送端程序:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>

#define SERVER_PORT 8888

int main(int argc, const char * argv[]) {
    int sockfd;
    struct sockaddr_in server_addr;
    char buf[256] = "Hello, server";

    if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
        perror("socket failed");
        exit(EXIT_FAILURE);
    }

    memset(&server_addr, 0, sizeof(server_addr));
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(SERVER_PORT);
    server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");

    if (sendto(sockfd, buf, strlen(buf), 0, (struct sockaddr *) &server_addr, sizeof(server_addr)) < 0) {
        perror("sendto failed");
        exit(EXIT_FAILURE);
    }

    printf("Message sent to the server\n");

    close(sockfd);
    return 0;
}

接收端程序:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>

#define SERVER_PORT 8888

int main(int argc, const char * argv[]) {
    int sockfd;
    struct sockaddr_in server_addr, client_addr;
    socklen_t client_len = sizeof(client_addr);
    char buf[256];

    if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
        perror("socket failed");
        exit(EXIT_FAILURE);
    }

    memset(&server_addr, 0, sizeof(server_addr));
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(SERVER_PORT);
    server_addr.sin_addr.s_addr = htonl(INADDR_ANY);

    if (bind(sockfd, (struct sockaddr *) &server_addr, sizeof(server_addr)) < 0) {
        perror("bind failed");
        exit(EXIT_FAILURE);
    }

    memset(buf, 0, sizeof(buf));
    if (recvfrom(sockfd, buf, sizeof(buf), 0, (struct sockaddr *) &client_addr, &client_len) < 0) {
        perror("recvfrom failed");
        exit(EXIT_FAILURE);
    }

    printf("Message received from client: %s\n", buf);

    close(sockfd);
    return 0;
}

以上程序示例中,发送端程序使用sendto函数将数据包发送给指定IP地址和端口号的接收端程序,接收端程序使用recvfrom函数从socket接收数据包并输出到控制台。其中,sockfd为socket句柄,server_addr和client_addr为目标地址和来源地址结构体,buf为发送的数据缓冲区。使用socket编程实现UDP通信需要注意设定正确的IP地址、端口号和套接字选项,实现相应的错误处理机制以保证程序的稳定性。UDP(User Datagram Protocol)是一种无连接的传输层协议,提供面向事务和不可靠的数据包传输服务。C语言可以通过socket编程实现UDP通信。下面是一个简单的C语言程序示例,使用socket编程实现UDP通信。

发送端程序:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>

#define SERVER_PORT 8888

int main(int argc, const char * argv[]) {
    int sockfd;
    struct sockaddr_in server_addr;
    char buf[256] = "Hello, server";

    if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
        perror("socket failed");
        exit(EXIT_FAILURE);
    }

    memset(&server_addr, 0, sizeof(server_addr));
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(SERVER_PORT);
    server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");

    if (sendto(sockfd, buf, strlen(buf), 0, (struct sockaddr *) &server_addr, sizeof(server_addr)) < 0) {
        perror("sendto failed");
        exit(EXIT_FAILURE);
    }

    printf("Message sent to the server\n");

    close(sockfd);
    return 0;
}

接收端程序:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>

#define SERVER_PORT 8888

int main(int argc, const char * argv[]) {
    int sockfd;
    struct sockaddr_in server_addr, client_addr;
    socklen_t client_len = sizeof(client_addr);
    char buf[256];

    if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
        perror("socket failed");
        exit(EXIT_FAILURE);
    }

    memset(&server_addr, 0, sizeof(server_addr));
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(SERVER_PORT);
    server_addr.sin_addr.s_addr = htonl(INADDR_ANY);

    if (bind(sockfd, (struct sockaddr *) &server_addr, sizeof(server_addr)) < 0) {
        perror("bind failed");
        exit(EXIT_FAILURE);
    }

    memset(buf, 0, sizeof(buf));
    if (recvfrom(sockfd, buf, sizeof(buf), 0, (struct sockaddr *) &client_addr, &client_len) < 0) {
        perror("recvfrom failed");
        exit(EXIT_FAILURE);
    }

    printf("Message received from client: %s\n", buf);

    close(sockfd);
    return 0;
}

以上程序示例中,发送端程序使用sendto函数将数据包发送给指定IP地址和端口号的接收端程序,接收端程序使用recvfrom函数从socket接收数据包并输出到控制台。其中,sockfd为socket句柄,server_addr和client_addr为目标地址和来源地址结构体,buf为发送的数据缓冲区。使用socket编程实现UDP通信需要注意设定正确的IP地址、端口号和套接字选项,实现相应的错误处理机制以保证程序的稳定性。

  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
UDP组播通信是一种基于UDP协议的多播通信方式,可以在局域网内实现一对多的数据传输。以下是使用C语言实现UDP组播通信的基本步骤: 1. 创建UDP套接字: 使用`socket()`函数创建一个UDP套接字,指定协议族为`AF_INET`,类型为`SOCK_DGRAM`。 2. 设置组播地址和端口: 使用`setsockopt()`函数设置多播组地址和端口,其中IP地址为组播地址,端口为组播监听的端口。 3. 绑定套接字: 使用`bind()`函数将套接字绑定到本地IP地址和指定的端口上。 4. 加入组播组: 使用`setsockopt()`函数设置套接字的`IP_ADD_MEMBERSHIP`选项,将套接字加入到指定的组播组中。 5. 接收组播数据: 使用`recvfrom()`函数从套接字接收组播数据。 6. 发送组播数据: 使用`sendto()`函数将数据发送到指定的组播地址和端口。 下面是一个简单的UDP组播通信的示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #define GROUP_ADDR "239.0.0.1" // 组播地址 #define PORT 8888 // 组播端口 int main() { int sockfd; struct sockaddr_in addr; char buffer[1024]; // 创建UDP套接字 sockfd = socket(AF_INET, SOCK_DGRAM, 0); if (sockfd < 0) { perror("socket creation failed"); exit(EXIT_FAILURE); } // 设置组播地址和端口 memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_addr.s_addr = inet_addr(GROUP_ADDR); addr.sin_port = htons(PORT); // 绑定套接字 if (bind(sockfd, (struct sockaddr*)&addr, sizeof(addr)) < 0) { perror("bind failed"); exit(EXIT_FAILURE); } // 加入组播组 struct ip_mreq mreq; memset(&mreq, 0, sizeof(mreq)); mreq.imr_multiaddr.s_addr = inet_addr(GROUP_ADDR); mreq.imr_interface.s_addr = htonl(INADDR_ANY); if (setsockopt(sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq)) < 0) { perror("setsockopt failed"); exit(EXIT_FAILURE); } // 接收组播数据 while (1) { memset(buffer, 0, sizeof(buffer)); if (recvfrom(sockfd, buffer, sizeof(buffer), 0, NULL, NULL) < 0) { perror("recvfrom failed"); exit(EXIT_FAILURE); } printf("Received data: %s\n", buffer); } // 关闭套接字 close(sockfd); return 0; } ``` 这是一个组播接收端的示例代码,可以接收从同一组播地址和端口发送的数据。你可以根据需要修改代码来实现组播发送端。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

九点两刻

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值