Part Number: MSP432E401Y
Tool/software: TI-RTOS
Hi,
I'm working on an application that requires to connect with multiples server as client TCP/IP. I'm able to connect with the first server, but I cannot close the connection and to open a new one in the same socket.
My code here:
void tcpHandler_Client(uint32_t arg0, uint32_t arg1)
/*******************************************************************************
* @fn tcpHandler
*
* @brief Creates new Task to handle new TCP connections.
*
* @param arg0: PORT SERVER
*
* @return none
*/
{
void *thread = NULL;
int status;
int client;
struct sockaddr_in ServerAddr;
struct sockaddr_in falseAddr;
int optval;
int bytesSent;
int optlen = sizeof(optval);
/* TCP Socket */
client = socket(AF_INET, SOCK_STREAM, 0);
if (client == -1) {
/* socket failed */
/* TO DO */
goto shutdown;
}
memset(&ServerAddr, 0, sizeof(ServerAddr));
ServerAddr.sin_family = AF_INET;
ServerAddr.sin_addr.s_addr = htonl(arg1); //Address in compact mode (uin32_t)
ServerAddr.sin_port = htons(arg0);
memset(&falseAddr, 0, sizeof(falseAddr));
falseAddr.sin_family = AF_INET;
falseAddr.sin_addr.s_addr = NULL;
falseAddr.sin_port = NULL;
optval = TRUE;
status = setsockopt(client, SOL_SOCKET, SO_KEEPALIVE, &optval, optlen);
if (status == -1) {
/* setsockopt failed */
/* TO DO */
goto shutdown;
}
while(TRUE){
if (connect(client, (struct sockaddr *)&ServerAddr, sizeof(ServerAddr)) == EAI_BADFLAGS ){
/* connection failed */
/* check the error */
switch(fdError()){
case EADDRINUSE:
/* The specified address is already in use. */
TaskSleep(TCP_CLIENT_CONN);
break;
case EADDRNOTAVAIL:
/* The specified address is not available from the local machine. */
TaskSleep(TCP_CLIENT_CONN+1);
goto shutdown;
case EALREADY:
/* A connection request is already pending on this socket. */
TaskSleep(TCP_CLIENT_CONN+2);
break;
case EBADF:
/* The file descriptor (socket) is invalid. */
TaskSleep(TCP_CLIENT_CONN+3);
goto shutdown;
case ECONNREFUSED:
/* The attempt to connect was forcefully rejected. */
TaskSleep(TCP_CLIENT_CONN+4);
break;
case EHOSTUNREACH:
/* The host is not reachable. */
TaskSleep(TCP_CLIENT_CONN+5);
break;
case EINPROGRESS:
/* The request was accepted and is pending (non-blocking sockets). */
TaskSleep(TCP_CLIENT_CONN+6);
break;
case EINVAL:
/* Name arguments are invalid. */
TaskSleep(TCP_CLIENT_CONN+7);
goto shutdown;
case EISCONN:
/* The socket is already connected. */
TaskSleep(TCP_CLIENT_CONN+8);
break;
case ENOTSOCK:
/* The file descriptor does not reference a socket. */
TaskSleep(TCP_CLIENT_CONN+9);
goto shutdown;
case ETIMEDOUT:
/* Connection establishment timed out without establishing a connection. */
TaskSleep(TCP_CLIENT_CONN+10);
break;
default:
TaskSleep(TCP_CLIENT_CONN+11);
break;
}
}else{
bytesSent = send(client, "Test", sizeof("Test"), 0);
if (bytesSent < 0 || bytesSent != sizeof("Test")) {
/* fatal error */
//break;
}
TaskSleep(TCP_CLIENT_CONN);
close(client);
TaskSleep(TCP_CLIENT_CONN); } } /* accept failed */ shutdown: if (client != -1) { close(client); } }
After the first connection I receive the error
EISCONN because the socket is still connected, the close function seems does not work properly.
Any advice?