发布
社区首页 >问答首页 >dpdk概率性收不到包?

dpdk概率性收不到包?

提问于 2025-03-05 22:31:21
回答 0关注 0查看 3

F-Stack写个如下的udp server端代码

#include <arpa/inet.h>

#include <errno.h>

#include <fcntl.h>

#include <netinet/in.h>

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <sys/epoll.h>

#include <sys/socket.h>

#include <unistd.h>

#include "ff_api.h"

#include "ff_config.h"

#include "ff_epoll.h"

#define MAX_EVENTS 10000

#define MAX_BUFFER_SIZE 100

#define likely(x) __builtin_expect(!!(x), 1)

#define unlikely(x) __builtin_expect(!!(x), 0)

#include <sys/time.h>

int server_sockfd = 0;

int epollfd = 0;

struct epoll_event event, events[MAX_EVENTS];

/**

* Returns the current time in microseconds.

*/

long getMicrotime() {

struct timeval currentTime;

gettimeofday(&currentTime, NULL);

return currentTime.tv_sec * (int)1e6 + currentTime.tv_usec;

}

int count = 0;

long start_ts = 0;

long last_ts = 0;

char buffer[MAX_BUFFER_SIZE];

int set_nonblocking(int sockfd) {

int flags = ff_fcntl(sockfd, F_GETFL, 0);

if (flags == -1) {

perror("ff_fcntl(F_GETFL) failed");

return -1;

}

flags |= O_NONBLOCK;

if (ff_fcntl(sockfd, F_SETFL, flags) == -1) {

perror("ff_fcntl(F_SETFL) failed");

return -1;

}

return 0;

}

int loop(void* arg) {

// memset(buffer, 0, sizeof(buffer));

struct sockaddr_in client_addr;

socklen_t client_addr_len;

int nfds = ff_epoll_wait(epollfd, events, MAX_EVENTS, -1);

if (unlikely(start_ts == 0)) {

start_ts = getMicrotime();

}

if (unlikely(last_ts == 0)) {

last_ts = start_ts;

}

for (int i = 0; i < nfds; i++) {

int sockfd = events[i].data.fd;

if ((sockfd == server_sockfd) && (events[i].events & EPOLLIN)) {

client_addr_len = sizeof(client_addr);

ssize_t len = ff_recvfrom(sockfd, buffer, MAX_BUFFER_SIZE, 0,

(struct linux_sockaddr*)&client_addr, &client_addr_len);

if (len == -1) {

perror("recvfrom() failed");

continue;

}

count++;

if (count % 1000000 == 0) {

// printf("Received %zd bytes from %s:%d\n", len, inet_ntoa(client_addr.sin_addr),

// ntohs(client_addr.sin_port)); printf("Content: %s\n", buffer);

long now = getMicrotime();

printf("count = %d,\tts = %llu[us], delta_duration = %llu[us], total_duration = %llu[us]\n",

count, now, now - last_ts, now - start_ts);

last_ts = now;

}

// memset(buffer, 0, sizeof(buffer));

printf("Content: %s\n", buffer);

}

}

}

int main(int argc, char* argv[]) {

ff_init(argc, argv);

server_sockfd = ff_socket(AF_INET, SOCK_DGRAM, 0);

if (server_sockfd == -1) {

perror("socket() failed");

return -1;

}

printf(" socket %d\n", server_sockfd);

struct sockaddr_in server_addr;

memset(&server_addr, 0, sizeof(server_addr));

server_addr.sin_family = AF_INET;

server_addr.sin_port = htons(9090);

server_addr.sin_addr.s_addr = inet_addr("10.115.0.145");

if (ff_bind(server_sockfd, (struct linux_sockaddr*)&server_addr, sizeof(server_addr)) == -1) {

perror("bind() failed");

return -1;

}

epollfd = ff_epoll_create(0);

if (epollfd == -1) {

perror("ff_epoll_create1() failed");

return -1;

}

memset(&event, 0, sizeof(event));

event.events = EPOLLIN;

event.data.fd = server_sockfd;

if (ff_epoll_ctl(epollfd, EPOLL_CTL_ADD, server_sockfd, &event) == -1) {

perror("ff_epoll_ctl(EPOLL_CTL_ADD) failed");

return -1;

}

ff_run(loop, NULL);

ff_close(epollfd);

ff_close(server_sockfd);

return 0;

}

用非dpdk的udp client端给dpdk server端发包,server端有时候会收不到client发来的包。通过

rte_eth_stats_get获取的状态里,q_ipackets为0。有人遇到么?

回答

和开发者交流更多问题细节吧,去 写回答
相关文章

相似问题

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