Reputation:
im using socket in c and got success on send/recv. however, the problem is when my server crashes, the client has to reconnect the server (server runs after some time). so here what i did:
this algorithm is not working for me. is there any ideas?
code:
int initSocket(char *servIP, unsigned short serverPort)
{
portNum = serverPort;
ipAddr = servIP;
/* Socket descriptor */
struct sockaddr_in echoServAddr; /* Echo server address */
if ((sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
{
printf("socket() failed");
bConnected = -1;
return -1;
}
/* Construct the server address structure */
memset(&echoServAddr, 0, sizeof(echoServAddr)); /* Zero out structure */
echoServAddr.sin_family = AF_INET; /* Internet address family */
echoServAddr.sin_addr.s_addr = inet_addr(ipAddr); /* Server IP address */
echoServAddr.sin_port = htons(portNum); /* Server port */
struct timeval timeout;
timeout.tv_sec = 0;
timeout.tv_usec = 20000;
if (setsockopt (sock, SOL_SOCKET, SO_RCVTIMEO, (char *)&timeout, sizeof(timeout)) < 0)
error("setsockopt failed\n");
/*if (setsockopt (sock, SOL_SOCKET, SO_SNDTIMEO, (char *)&timeout, sizeof(timeout)) < 0)
error("setsockopt failed\n");
*/
/* Establish the connection to the echo server */
if (connect(sock, (struct sockaddr *) &echoServAddr, sizeof(echoServAddr)) < 0)
{
printf("connect() failed\n");
bConnected = -1;
//close(sock);
return -1;
}
bConnected = 0;
return 0;
}
--------------- if server crashes ------------
if(recv_size == 0)
{
// server crashed
while(initSocket(ipAddr, portNum) < 0)
{
printf("IP : %s\v", ipAddr);
printf("Port : %d\v", portNum);
}
}
-----------------------------
Upvotes: 4
Views: 7578
Reputation: 229108
- create a socket
- connect
- recv/send if recv size == 0 go to step 2.
You cannot re-connect a TCP socket, you have to create a new one. You'd also want to handle the case where recv or send errors.
So this have to be:
Though, it seems your code already does all these steps, and not just repeating step 2 and 3, so it's a bit unclear what's the actual problem you are observing.
In addition, your initSocket() code does not close() the socket when connect() fails, so you'll easily leak sockets and run out of file descriptors in less than a second once the server fails, you have to close() the socket you just created if you're not going to use it.
Upvotes: 7