简单UDP套接字代码,发送和接收消息
Simple UDP socket code, sending and receiving messages
我只是学习UDP套接字,这是我的第一个涉及它的代码。我有两个来回发送和接收信息的程序。我的问题是,似乎我必须声明我在整个代码中多次发送/接收哪个IP地址,因为它发生了变化,但我觉得有一种更好的方法可以做到这一点,而无需在代码中手动更改inet_addr。从我的阅读来看,sendto和recvfrom可能会有所帮助,但我不确定如何在这种情况下使用它们。如果有人能告诉我如何解决我的简单问题,我会非常感激!由于
CODE 1: Send then Receive
int main(int argc, char *argv[])
{
//initialize socket and structure
int socket_info;
struct sockaddr_in server;
char message[100];
char incoming_message[100];
printf("Input Message: ");
fgets(message, 100, stdin);
//create socket
socket_info = socket(AF_INET, SOCK_DGRAM, 0);
if (socket_info == -1) {
printf("Could not create socket");
}
//assign local values
server.sin_addr.s_addr = inet_addr("172.21.8.178");
server.sin_family = AF_INET;
server.sin_port = htons( 1100 );
//binds connection
if (bind(socket_info, (struct sockaddr *)&server, sizeof(server)) < 0) {
perror("Connection error");
return 1;
}
puts("Bind");
//assign new value to connect to
server.sin_addr.s_addr = inet_addr("172.21.8.179");
//checks connection
if (connect(socket_info, (struct sockaddr *)&server, sizeof(server)) < 0) {
perror("Connection error");
return 1;
}
puts("Connected");
//sends message
if(send(socket_info, message, strlen(message), 0) <0) {
perror("Send failed");
return 1;
}
puts("Message Sent");
//receives message back
if(recv(socket_info, incoming_message, sizeof(incoming_message), 0) <0) {
puts("Received failed");
return 1;
}
puts("Message received");
puts(incoming_message);
close(socket_info);
}
CODE 2: Receive then Send
int main(int argc, char *argv[])
{
//initialize socket and structure
int socket_info;
struct sockaddr_in server;
char incoming_message[100];
//create socket
socket_info = socket(AF_INET, SOCK_DGRAM, 0);
if (socket_info == -1) {
printf("Could not create socket");
}
//assign values
server.sin_addr.s_addr = inet_addr("172.21.8.179");
server.sin_family = AF_INET;
server.sin_port = htons( 1100 );
//checks connection
if (bind(socket_info, (struct sockaddr *)&server, sizeof(server)) < 0) {
perror("Connection error");
return 1;
}
puts("Bind");
//Receive an incoming message
if( recv(socket_info, incoming_message, sizeof(incoming_message), 0) < 0) {
puts("Received failed");
return 1;
}
puts("Message received");
puts(incoming_message);
server.sin_addr.s_addr = inet_addr("172.21.8.178");
if (connect(socket_info, (struct sockaddr *)&server, sizeof(server)) < 0) {
perror("Connection error");
return 1;
}
puts("Connected");
//Sends message back
char message[100];
printf("Input Message: ");
fgets(message, 100, stdin);
if(send(socket_info, message, strlen(message), 0) <0) {
perror("Send failed");
return 1;
}
puts("Message Sent");
close(socket_info);
}
如果使用recvfrom()函数
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
struct sockaddr *src_addr, socklen_t *addrlen);
这个函数的作用是用它刚刚收到的数据包的IP和端口信息填充一个sockaddr结构。例如,如果先发送后接收的代码向接收方发送了一个数据包,接收方应该能够用正确的值填充sin_addr和sin_port的结构值。然后,您可以使用此信息调用sendto(),以便将其发送到正确的机器。
下面是这些函数的手册页:
https://linux.die.net/man/2/recvfrom https://linux.die.net/man/2/sendto试试:
inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr)
127.0.0.1为环回IP。该地址用于建立与同一台机器的IP连接,这似乎是您的情况。
解决这个问题的详细方法可以在这里找到
相关文章:
- 如何在C++中创建特定大小的消息以通过UDP套接字发送?
- C++ UDP 服务器在获取客户端地址配置时发送消息
- UDP 客户端不会在 esp32 上广播消息
- C# UDP 套接字无法接收消息
- 来自 C++ 的 UDP 消息不会被 Rust 接收
- 从 ICMP 消息访问 UDP
- 打包用于 UDP 网络的消息
- UDP测试代码未接收消息(C++)
- 如何将 UDP 消息发送到局域网中的每台计算机
- C++ 同时接收 2 条或更多 UDP 消息
- 即使在客户端停止或服务器重新启动后,UDP 消息仍会不断到达
- 将多个 UDP 消息发送到单个修订者
- 将结构转换为要传递给 UDP 的常规消息格式
- 在一条UDP消息中发送两个数据块,而不复制数据块
- UDP套接字是否将接收到的数据划分为不同的消息,或者recv是否同时读取尽可能多的数据
- libcurl是否能够通过UDP发送http消息
- 使用boost的多种数据类型的Udp消息
- 服务器端口没有接收到UDP消息
- 简单UDP套接字代码,发送和接收消息
- Erlang-向UDP多播会话发送消息