I am writing an echo application that calls shutdown to turn off receive side when a certain number of packets are received however ff_shutdown() is not working with UDP sockets.
I tried the same thing with TCP sockets and it is working as expected.
#include <stdio.h>
#include <sys/ioctl.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include <strings.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <errno.h>
#include <assert.h>
#include "ff_config.h"
#include "ff_api.h"
int sockfd;
char clientip[]="14.0.0.17";
int clientport=15310;
int serverport=15310;
int cnt =0;
struct sockaddr_in servaddr;
int loop(void *arg)
{
struct sockaddr_in serv_addr;
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(serverport);
char recv_buf[2048];
int recv_len;
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(serverport);
inet_pton(AF_INET, "14.0.0.17", &servaddr.sin_addr);
int n, len;
recv_len = ff_recvfrom(sockfd, (char *)recv_buf, 2048, MSG_WAITALL, (struct sockaddr *) &servaddr,&len);
if (recv_len>0)
{
printf("recv_len = %d\n", recv_len);
printf("Recv: %s \n", recv_buf);
cnt ++;
}
if (cnt == 3)
{
printf("shutting down recv side\n");
cnt++;
ff_shutdown(sockfd,0);
}
struct sockaddr_in remote_addr;
memset(&remote_addr, 0, sizeof(remote_addr));
remote_addr.sin_family = AF_INET;
remote_addr.sin_port = htons(clientport);
remote_addr.sin_addr.s_addr = inet_addr(clientip);
ff_sendto(sockfd, recv_buf, strlen(recv_buf) + 1, 0, (struct linux_sockaddr *)&remote_addr, sizeof(remote_addr));
}
int main(int argc, char *argv[])
{
ff_init(argc, argv);
sockfd = ff_socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd < 0)
{
printf("ff_socket failed\n");
exit(1);
}
ff_run(loop, NULL);
return 0;
}
I am writing an echo application that calls shutdown to turn off receive side when a certain number of packets are received however ff_shutdown() is not working with UDP sockets.
I tried the same thing with TCP sockets and it is working as expected.
Here is sample code to reproduce the problem: