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