Hi to All,

         I am creating 3 socket. At the second time socket creation
,SO_REUSEADDR gives illegal seek (29) error.
same error is coming while running this code in Linux PC also. i don't know
why this happening.

  Can anyone help me to resolve this problem?

My Source Code is:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
#include <unistd.h>
#include <errno.h>
#include <netdb.h>

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

/////////////////////////////////////////////////////
//    #define
/////////////////////////////////////////////////////

#define MULTICAST_MTX_IP "239.192.14.120"

#define MULTICAST_MTX_PORT 16500

#define MULTICAST_UTX_IP "192.168.2.81"

#define MULTICAST_UTX_PORT 16502

#define MULTICAST_RX_IP "239.192.14.110"

#define MULTICAST_RX_PORT 50002

#define MAXDATALENGTH 1600

typedef enum TX_TYPE
{
    UNICAST = 0,
    MULTICAST
}TX_TYPE;

typedef enum SOCK_TYPE
{
    TRANSMIT = 0,
    RECEIVE
}SOCK_TYPE;

/////////////////////////////////////////////////////
//    structures
/////////////////////////////////////////////////////

typedef struct mdr_sock_information
{
    int mdr_mcasttx_sock_fd;
    int mdr_ucasttx_sock_fd;
    int mdr_rxudp_sock_fd;
    int mdr_rxhttp_sock_fd;
}mdr_sock_information;

/////////////////////////////////////////////////////
//    static variable
/////////////////////////////////////////////////////

static char recvedbuffer[MAXDATALENGTH];
static char databuffer[1280*720];

/////////////////////////////////////////////////////
//    global variable
/////////////////////////////////////////////////////

mdr_sock_information mdr_sock_info;

/////////////////////////////////////////////////////
//    function prototype
/////////////////////////////////////////////////////

void retransmit_mdr_stream();
void mdr_stream_threadfxn();
int  create_txrx_udp_socket(char *, int, int, int, unsigned char);
void recvdata_udp_sock();
int  mdr_data_send();

/////////////////////////////////////////////////////
//    functions
/////////////////////////////////////////////////////

void retransmit_mdr_stream()
{
    mdr_stream_threadfxn();
}

void mdr_stream_threadfxn()
{
    mdr_sock_info.mdr_mcasttx_sock_fd =
create_txrx_udp_socket(MULTICAST_MTX_IP, MULTICAST_MTX_PORT, TRANSMIT,
MULTICAST, 64);
    if(mdr_sock_info.mdr_mcasttx_sock_fd == -1)
        printf("failed in create_transmit_multicast_udp_socket\n\n");
    else
        printf("success in create_transmit_multicast_udp_socket\n\n");

    mdr_sock_info.mdr_ucasttx_sock_fd =
create_txrx_udp_socket(MULTICAST_UTX_IP, MULTICAST_UTX_PORT, TRANSMIT,
UNICAST, 64);
    if(mdr_sock_info.mdr_ucasttx_sock_fd == -1)
        printf("failed in create_transmit_unicast_udp_socket\n\n");
    else
        printf("success in create_transmit_unicast_udp_socket\n\n");

    mdr_sock_info.mdr_rxudp_sock_fd =
create_txrx_udp_socket(MULTICAST_RX_IP, MULTICAST_RX_PORT, RECEIVE,
MULTICAST, 64);
    if(mdr_sock_info.mdr_rxudp_sock_fd == -1)
        printf("failed in create_receive_unicast_udp_socket\n\n");
    else
        printf("success in create_receive_unicast_udp_socket\n\n");

    //recvdata_udp_sock();
}

int create_txrx_udp_socket(char *media_address,int port,int tx_type, int
sock_type, unsigned char ttl) // Option  = 1 for Multicast 0 - for Unicast
{
    struct   sockaddr_in mdr_client;
    struct   sockaddr_in mdr_server;
    struct   ip_mreq mdr_mreq;
    int         mdr_sock_timeout;
    int      mdr_sockfd = -1;
    int         mdr_sock_option;
    int      mdr_sock_type;
    int         on;
    unsigned char mdr_ttl;

    ////////////////////////////////////////////////////////////
    //mdr - socket
    ////////////////////////////////////////////////////////////
    mdr_sock_option = tx_type;

    mdr_sock_type = sock_type;

    mdr_ttl = ttl;

    on = 1;

    mdr_sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    if( mdr_sockfd < 0 )
    {
           perror("failed socket :");
         close(mdr_sockfd);
        goto leave_udp;
    }

      setsockopt( mdr_sockfd, SOL_SOCKET, SO_REUSEADDR, (void*)&on,
sizeof(on));
    perror("setsock SO_REUSEADDR :");

    bzero( &mdr_client, sizeof(struct sockaddr_in) );
    mdr_client.sin_family = AF_INET;
    mdr_client.sin_port   = htons(port);
      mdr_client.sin_addr.s_addr = INADDR_ANY;


    if(mdr_sock_option == MULTICAST)
    {
        setsockopt(mdr_sockfd, IPPROTO_IP, IP_MULTICAST_TTL, &mdr_ttl,
sizeof(mdr_ttl));
        perror("setsockopt IP_MULTICAST_TTL :");

        if(mdr_sock_type == RECEIVE)
        {
            mdr_mreq.imr_multiaddr.s_addr = inet_addr(media_address);
            mdr_mreq.imr_interface.s_addr = htonl(INADDR_ANY);

            setsockopt(mdr_sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mdr_mreq,
sizeof(struct ip_mreq));
              perror("setsock IP_ADD_MEMBERSHIP :");

            mdr_sock_timeout = 100;
              setsockopt(mdr_sockfd, SOL_SOCKET, SO_RCVTIMEO, (char *)
&mdr_sock_timeout, sizeof(int));
            perror("setsock SO_RCVTIMEO :");
        }
    }

      if(bind(mdr_sockfd, (struct sockaddr *)&mdr_client, sizeof( struct
sockaddr ) ) < 0 )
    {
        perror("failed bind :");
        close(mdr_sockfd);
        goto leave_udp;
    }

      bzero( &mdr_server, sizeof(struct sockaddr_in) );
    mdr_server.sin_family = AF_INET;
    mdr_server.sin_port   = htons(port);
      mdr_server.sin_addr.s_addr = inet_addr(media_address);

    return mdr_sockfd;

    leave_udp:

            return -1;
}

int main()
{
    retransmit_mdr_stream();

    return 0;
}

-- 
Thanks & Regards,
K.Sathish Kumar.
_______________________________________________
Davinci-linux-open-source mailing list
[email protected]
http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-source

Reply via email to