【发布时间】:2016-10-31 15:36:32
【问题描述】:
我正在做一个很酷的项目,我需要将 100,000 个 UDP 数据包从服务器发送到客户端,数据包到数据包的延迟为 10 毫秒。服务器是具有公共 IP 地址的 Debian 服务器。客户端是另一台带有 LTE USB 调制解调器的 Debian PC。客户端没有公共 IP 地址并且知道我的服务器的公共 IP 地址。我的 4G/LTE 提供商不向他们的客户提供公共 IP 地址。 我需要建立一个稳定的 UDP 套接字连接,但我正在努力保持套接字连接处于活动状态。
有人可以帮帮我吗?
谢谢
最好的问候
/**** CLIENT ****/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#define PORT 20009
int main()
{
int sock;
int size;
int nbytes, flags;
int i;
int a = 0;
char * cp;
char buffer[] = "012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789";
struct sockaddr_in target_pc, me;
sock = socket(PF_INET,SOCK_DGRAM,0);
if(sock < 0)
{
printf("socket error = %d\n", sock);
return -1;
}
target_pc.sin_family = PF_INET;
target_pc.sin_port = htons(PORT);
me.sin_family = PF_INET;
me.sin_port = htons(0);
me.sin_addr.s_addr = htonl(INADDR_ANY);
i = bind(sock, (struct sockaddr *) &me, sizeof(me));
if( i < 0)
{
printf("bind result: %d\n", i);
return -1;
}
nbytes = 200;
char str_addr[] = "155.55.25.25";
target_pc.sin_addr.s_addr = inet_addr(&str_addr[0]);
while(1)
{
nbytes = strlen(buffer);
flags = 0;
sendto(sock, (char *) buffer, nbytes,flags,(struct sockaddr *)&target_pc,sizeof(target_pc));
int addrlen = sizeof(target_pc);
size = recvfrom(sock, buffer, nbytes, flags, (struct sockaddr *)&target_pc,&addrlen);
if((size > 0) && (size < 200))
{
buffer[size] = '\0';
i = puts((char *) buffer);
}
printf("%i --- Size: %lu\n", a, sizeof(buffer));
a = a + 1;
}
return 0;
}
在我的服务器代码下方:
/*** SERVER ***/
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#define PORT 20009
void SleepMs(int ms)
{
usleep(ms*1000); //convert to microseconds
return;
}
int main()
{
int sock;
int size;
int nbytes, flags;
socklen_t addrlen;
int i;
char buffer[100];
char buffer2[] = "12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890\0";
struct sockaddr_in server;
struct sockaddr_in from;
sock = socket(AF_INET,SOCK_DGRAM,0);
if(sock < 0)
{
printf("socket error = %d\n", sock);
return -1;
}
server.sin_family = AF_INET;
server.sin_addr.s_addr = htonl(INADDR_ANY);
server.sin_port = htons(PORT);
i = bind(sock, (struct sockaddr *) &server, sizeof(server));
if( i < 0){
printf("bind result: %d\n", i);
return -1;
}
else{
printf("Simple UDP server is ready!\n");
}
nbytes = 200;
flags = 0;
while(1)
{
addrlen = sizeof(from);
size = recvfrom(sock, buffer, nbytes, flags, (struct sockaddr *)&from, &addrlen);
if((size > 0) && (size < 200))
{
buffer[size] = '\0';
i = puts((char *) buffer);
}
printf("\n");
sock = socket(PF_INET,SOCK_DGRAM,0);
if(sock < 0)
{
printf("socket error = %d\n", sock);
return -1;
}
sendto(sock, buffer2, nbytes, flags, (struct sockaddr *)&from,addrlen);
SleepMs(10); // Packet-to-Packet Delay Time
}
return 0;
}
【问题讨论】:
-
你可以使用 TCP 连接代替吗? UDP 没有任何协议级别的连接感知,防火墙可以通过该连接识别来自您的服务器的数据响应来自您的客户端的请求。
-
没有 UDP 套接字连接这样的东西,当然不是必须“保持活动状态”的东西。你只是得到很多丢弃的数据包还是什么?
-
我需要使用 UDP。对不起... UDP 数据包传输的套接字连接是正确的 thx
-
您在服务器代码中泄漏了文件描述符(每条消息接收/发送一个)。
-
忘记“套接字连接”的想法。没有这样的事情,期间。 “socket error = -1”是另外一回事,与任何想象中的“连接”无关。仅仅因为存在错误并不意味着涉及神话生物(您的方法就好像它是神话一样)。请打印出完整的错误信息。