首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >向客户端发送100,000个UDP数据包(C套接字编程)

向客户端发送100,000个UDP数据包(C套接字编程)
EN

Stack Overflow用户
提问于 2016-10-31 23:36:33
回答 1查看 1.1K关注 0票数 0

我正在做一个很酷的项目,我需要从服务器向客户端发送100,000个UDP数据包,数据包到数据包的延迟为10ms。服务器是具有公共IP地址的Debian服务器。客户端是另一台装有LTE USB-Modem的Debian PC。客户端没有公共IP地址,但知道my Server的公共IP地址。我的4G/LTE提供商不向他们的客户提供公共IP地址。我需要建立一个稳定的UDP套接字连接,但我正在努力使套接字连接保持活动状态。

有人能帮帮我吗?

thx

诚挚的问候

代码语言:javascript
复制
/**** 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;
}

在我的服务器代码下面:

代码语言:javascript
复制
/*** 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;
}
EN

回答 1

Stack Overflow用户

发布于 2019-03-28 05:51:01

您可以使用服务器的IP进行连接,本例中为192.168.1.2

server.sin_addr.s_addr = inet_addr("192.168.1.2");

在这两个代码中使用它

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40345493

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档