我正在努力与UDP套接字。我想基准的时间交换两台机器之间的某种类型的数据。
我很快用C写了这个项目https://github.com/nowox/udp-test,我有一个简单的客户端:
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <fcntl.h>
#include <netdb.h>
#include <sys/time.h>
#include <arpa/inet.h>
#include <time.h>
#include <errno.h>
#define PORT (3000)
#define SUBIMAGES (1000)
#define FRAMES_PER_SUBIMAGES (23)
#define UDP_FRAME (1442)
#define SERVERADDRESS "127.0.0.1" // 138.131.156.36"
#define BUFFER_SIZE (SUBIMAGES * FRAMES_PER_SUBIMAGES * UDP_FRAME)
char buffer[BUFFER_SIZE];
/**
* Populate the buffer with random data.
*/
void build(uint8_t* buffer, size_t length)
{
for (size_t i = 0; i < length; i++)
{
buffer[i] = (rand() % 255) + 1;
}
}
int main(int argc, char **argv)
{
struct timespec start, end;
int sockfd;
struct sockaddr_in server;
printf("Build Data...\n");
build(buffer, sizeof(buffer));
printf("Configure socket...\n");
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd < 0)
{
fprintf(stderr, "Error opening socket");
return EXIT_FAILURE;
}
bzero((char*)&server, sizeof(server));
server.sin_family = AF_INET;
server.sin_addr.s_addr = inet_addr(SERVERADDRESS);
server.sin_port = htons(PORT);
printf("Send UDP data...\n");
clock_gettime(CLOCK_MONOTONIC_RAW, &start);
for (size_t i = 0; i < BUFFER_SIZE; i += UDP_FRAME)
{
if (sendto(sockfd, &buffer[i], UDP_FRAME, 0,
(const struct sockaddr*)&server, sizeof(server)) < 0)
{
fprintf(stderr, "Error in sendto()\n");
return EXIT_FAILURE;
}
}
clock_gettime(CLOCK_MONOTONIC_RAW, &end);
uint64_t delta_us = (end.tv_sec - start.tv_sec) * 1000000 +
(end.tv_nsec - start.tv_nsec) / 1000;
printf("Time to send %d subimages: %f[s]\n", SUBIMAGES, delta_us / 1e6f);
printf("Finished...\n");
return EXIT_SUCCESS;
}
字符串
我希望看到UDP的嵌入到Wireshark中,但似乎什么也没看到。
第一个问题:为什么我的套接字不发送任何东西?
我发现这是因为WSL(Linux的Windows子系统),所以我转向了Ubuntu
第二个问题:为什么我的服务器没有收到任何信息?
3条答案
按热度按时间jogvjijk1#
您正在将客户端绑定到与服务器相同的端口。这是无效的。您不需要绑定客户端。
注解掉客户端的bind调用,数据包将从随机选择的端口发送到服务器。您的服务器将接收它们,但您的服务器中存在另一个退出条件错误,因此在接收帧时添加一些错误,以查看它是否实际发生。
oxcyiej72#
wsl无法打开Windows防火墙,数据包丢失。用mingw编译它(添加ws2_32),它将工作
9udxz4iz3#
你在接收端尝试过不同的计算机吗?我在CentOS 7.9中遇到了防火墙问题。
如果其他计算机无法接收任何可能是由于发送代码.这里是另一个代码从John Selbie's post与修改为C编程语言.我也使用端口号10102在同一子网.
字符串
这是雷米勒博用C++编程语言编写的接收端代码。你可以找到C版本或转换此片段。
型
工作环境:
操作系统:Ubuntu 18.04
GCC 7.5
G++ 5.4