Skip to content

ff_shutdown() not working on UDP sockets #631

Description

@sarosharif

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:

#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;
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions