OS:ubuntu18.04
gcc:gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0
I can capture data using both tcpdump and Wireshark, but I cannot receive data using the recvfrom function.
source code:
#include <iostream>
#include <cstring>
#include <arpa/inet.h>
#include <unistd.h>
#include <iomanip>
const int BUFFER_SIZE = 1024;
int main() {
int sockfd;
struct sockaddr_in server_addr, client_addr;
char buffer[BUFFER_SIZE];
socklen_t addr_len = sizeof(client_addr);
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd < 0) {
perror("socket");
return 1;
}
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
//server_addr.sin_addr.s_addr = INADDR_ANY;
server_addr.sin_port = htons(42867);
inet_pton(AF_INET, "172.31.3.81", &server_addr.sin_addr);
if (bind(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) {
perror("bind");
close(sockfd);
return 1;
}
// std::cout << "Waiting for UDP packets on port 42867..." << std::endl;
const char *message = "Hello from server!";
const char *client_ip = "172.31.3.77";
int client_port = 10000;
int opt = 1;
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
setsockopt(sockfd, SOL_SOCKET, SO_REUSEPORT, &opt, sizeof(opt));
while (true) {
memset(buffer, 0, BUFFER_SIZE);
ssize_t recv_len = recvfrom(sockfd, buffer, BUFFER_SIZE - 1, 0,
(struct sockaddr*)&client_addr, &addr_len);
std::cout << "recv_len: " << recv_len << std::endl;
if (recv_len < 0) {
perror("recvfrom");
break;
}
buffer[recv_len] = '';
char client_ip[INET_ADDRSTRLEN];
inet_ntop(AF_INET, &client_addr.sin_addr, client_ip, sizeof(client_ip));
std::cout << "Received from port: " << ntohs(client_addr.sin_port) << std::endl;
std::cout << std::endl;
}
close(sockfd);
return 0;
}
output:
recv_len: 99
Received from port: 10001
recv_len: 99
Received from port: 10001
recv_len: 99
Received from port: 10001
recv_len: 99
Received from port: 10001
recv_len: 99
Received from port: 10001
recv_len: 99
Received from port: 10001
Only received data with a length of 99, cannot receive data with a length of 902.
Why?
New contributor
dada li is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
4