浅谈C++之UDP通信
基本步骤
在C++中,可以使用标准库中的套接字API来实现UDP通信。以下是使用UDP进行通信的基本步骤:
1. 创建UDP服务器(接收端)
#include <iostream>
#include <cstring> // for memset
#include <sys/socket.h> // for socket functions
#include <netinet/in.h> // for sockaddr_in
#include <arpa/inet.h> // for inet_addr
int main() {
int server_fd, new_socket;
struct sockaddr_in address;
int opt = 1;
int addrlen = sizeof(address);
char buffer[1024] = {0};
char *hello = "Hello from server";
// Creating socket file descriptor
if ((server_fd = socket(AF_INET, SOCK_DGRAM, 0)) == 0) {
perror("socket failed");
exit(EXIT_FAILURE);
}
// Forcefully attaching socket to the port 8080
if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) {
perror("setsockopt");
exit(EXIT_FAILURE);
}
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons(8080);
// Forcefully attaching socket to the port 8080
if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {
perror("bind failed");
exit(EXIT_FAILURE);
}
while (1) {
// Clear the buffer by using memset
memset(buffer, 0, 1024);
// Receive message from client
if (recvfrom(server_fd, buffer, 1024, 0, (struct sockaddr *)&address, (socklen_t*)&addrlen) < 0) {
perror("recvfrom failed");
exit(EXIT_FAILURE);
}
std::cout << "Client : " << buffer << std::endl;
// Send message to client
if (sendto(server_fd, hello, strlen(hello), 0, (struct sockaddr *)&address, addrlen) < 0) {
perror("sendto failed");
exit(EXIT_FAILURE);
}
}
return 0;
}
2. 创建UDP客户端(发送端)
#include <iostream>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
int main() {
int sock = 0;
struct sockaddr_in serv_addr;
char *hello = "Hello from client";
char buffer[1024] = {0};
if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
std::cout << "\n Socket creation error \n";
return -1;
}
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(8080);
// Convert IPv4 and IPv6 addresses from text to binary form
if(inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr)<=0) {
std::cout << "\nInvalid address/ Address not supported \n";
return -1;
}
// Send message to server
sendto(sock, hello, strlen(hello), 0, (struct sockaddr *)&serv_addr, sizeof(serv_addr));
printf("Hello message sent\n");
// Receive response from the server
int valread = recvfrom(sock, buffer, 1024, 0, (struct sockaddr *)&serv_addr, sizeof(serv_addr));
printf(" %s \n", buffer);
return 0;
}
注意事项:
- 确保在编译时链接了正确的库,例如使用
g++ -o udp_server udp_server.cpp
和g++ -o udp_client udp_client.cpp
。 - 服务器和客户端都应该检查套接字操作的返回值,以处理可能的错误。
- 在实际应用中,你可能需要处理异常和错误,例如网络中断或数据包丢失。
- 确保服务器和客户端的端口号匹配,并且服务器端口没有被其他应用占用。
- 考虑到UDP是不可靠的,你可能需要在应用层实现一些机制来确保数据的完整性和顺序。
原文地址:https://blog.csdn.net/a876106354/article/details/142898115
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!