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(¤tTime, 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。有人遇到么?
相似问题