Tuesday, 3 September 2013

Glib::gio g_socket_client set timeout is not working properly

Glib::gio g_socket_client set timeout is not working properly

I am using glib::gio socket client to connect with server socket for
sending and receiving data. While creating socket connection i am setting
socket timeout as 30seconds. I need to change this timeout(5secs) whenever
i wait in read call.
Problem is i am unable to reset the socket client timeout before read
call. Whenever i reset the socket client timeout am not getting any error
msg but the new timeout is not reflected on my socket connection(it
maintains the initial timeout which i set while connecting socket).
my code::
int connectToServer(char serverIP[], int serverPort)
{
GSocketClient * serverSockClient;
GSocketConnection * serverSockConn;
GOutputStream * serverSockOutStream;
GInputStream * serverSockInStream;
GError * error = NULL;
struct _GSocketAddress socketAddress;
g_type_init ();
g_print("\n start\n");
/* create a new connection */
serverSockClient = g_socket_client_new();
/* connect to the host */
if(serverSockClient != NULL ){
g_socket_client_set_family(serverSockClient,G_SOCKET_FAMILY_IPV4);
g_socket_client_set_protocol(serverSockClient,G_SOCKET_PROTOCOL_TCP);
g_socket_client_set_socket_type(serverSockClient,G_SOCKET_TYPE_STREAM);
g_socket_client_set_timeout(serverSockClient,defaultTimeout);
GSocketAddress * gSocketAddress =
g_socket_address_new_from_native(&socketAddress,sizeof(socketAddress));
g_socket_client_set_local_address(serverSockClient,gSocketAddress);
serverSockConn = g_socket_client_connect_to_host (serverSockClient,
(gchar*)serverIP,
serverPort, /*
your port goes
here */
NULL,
&error);
if (error != NULL)
{
g_print(error->message);
serverSockClient= NULL;
return -1;
}
else
{
g_print ("Connection successful!\n");
}
/* use the connection */
serverSockInStream = g_io_stream_get_input_stream (G_IO_STREAM
(serverSockConn));
serverSockOutStream = g_io_stream_get_output_stream (G_IO_STREAM
(serverSockConn));
char msg[256]={'\0'};
ReceiveFromSock(serverSockClient,serverSockInStream,serverSockConn,
msg,5);
}else{
printf("socketclient NULL : \n");
return -1;
}
return 0;
}
int ReceiveFromSock(GSocketClient * serverSockClient,GInputStream *
serverSockInStream,
GSocketConnection * serverSockConn, char *msg,int Rxtimeout)
{
int bytesRecvd=0;
GError * error = NULL;
if(serverSockClient != NULL && serverSockInStream != NULL &&
(g_input_stream_is_closed (serverSockInStream) == 0)){
g_socket_client_set_timeout(serverSockClient,Rxtimeout);
bytesRecvd = g_input_stream_read(serverSockInStream,msg,14,NULL,
&error);
if(error != NULL){
printf("ReceiveFromSock1 error string :: %s\n",error->message);
printf("ReceiveFromSock1 error code :: %d\n",error->code);
error = NULL;
return -1;
}
printf("Number of bytes recived : %d",bytesRecvd);
}
else
{
printf("serverSockInStream null || serverSockClient null \n");
}
g_socket_client_set_timeout(serverSockClient,defaultTimeout);
return 0;
}

No comments:

Post a Comment