edeviser wrote on Monday, March 19, 2018:
Hello,
I am running FreeRTOS+TCP and I have some trouble on setting up my server. The server goes like this:
void socketTask(void * pvParameters) {
// Create Listen Socket
c->listen_socket = FreeRTOS_socket(FREERTOS_AF_INET, FREERTOS_SOCK_STREAM, FREERTOS_IPPROTO_TCP);
if ( c->listen_socket == FREERTOS_INVALID_SOCKET)
return -1;
// Bind listen Socket
if (FreeRTOS_bind(c->listen_socket, &c->listen_addr, sizeof(c->listen_addr)))
return -1;
// Set Timeout
setRxTimeout(c, portMAX_DELAY);
setTxTimeout(c, portMAX_DELAY);
// Set Reuse socket option
const BaseType_t reuseSocket = pdTRUE;
if (FreeRTOS_setsockopt(c->listen_socket, 0, FREERTOS_SO_REUSE_LISTEN_SOCKET,
&reuseSocket, sizeof(reuseSocket)))
return -1;
c->remote_sock = c->listen_socket; // Already the same
for( ;; ) {
ret = FreeRTOS_listen(c->listen_socket, 1);
if (ret) {
DEBUG("Error (%d) listen...\n", ret);
vTaskDelay(100);
continue;
}
c->remote_sock = FreeRTOS_accept(c->listen_socket, &c->remote_addr, &l);
if (c->remote_sock == NULL) {
DEBUG("Cannot Accept Error Code %d\n", (int)c->remote_sock);
vTaskDelay(100);
continue;
}
/* Reading and Writing is done by some other service tasks */
// Wait for disconnect
SocketSet_t waitDisc = FreeRTOS_CreateSocketSet();
FreeRTOS_FD_SET(c->remote_sock, waitDisc, eSELECT_EXCEPT);
FreeRTOS_select(waitDisc, portMAX_DELAY);
DEBUG("connection terminated to %lu.\n", c->remote_addr.sin_addr);
FreeRTOS_closesocket(c->remote_sock);
taskYIELD();
}
To test my server I implemented a little client on my ubuntu host machine:
int main(int argc, char *argv[]) {
char recvBuff[1024];
struct sockaddr_in serv_addr;
if(argc != 4) {
printf("\n Usage: %s <ip of server> <port> <count>\n",argv[0]);
return 1;
}
for (int i = 0; i < atoi(argv[3]); i++) {
int sockfd = 0, n = 0;
struct timeval tv1, tv2;
memset(recvBuff, '0',sizeof(recvBuff));
if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
printf("\n Error : Could not create socket \n");
return 1;
}
memset(&serv_addr, '0', sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(atoi(argv[2]));
if(inet_pton(AF_INET, argv[1], &serv_addr.sin_addr)<=0)
{
printf("\n inet_pton error occured\n");
return 1;
}
gettimeofday(&tv1, NULL);
if( connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0)
{
printf("\n Error : Connect Failed \n");
return 1;
}
// Shutdown and close
if (shutdown(sockfd, SHUT_RDWR) != 0)
return -1;
if (close(sockfd) !=0)
return -1;
gettimeofday(&tv2, NULL);
printf ("Total time = %f ms\n",
(double) (tv2.tv_usec - tv1.tv_usec) / 1000000 +
(double) (tv2.tv_sec - tv1.tv_sec));
}
Lets take a look to the output of the client started with count = 3
Total time = 0.000359
Total time = 1.024391
Total time = 1.020205
Well, the really first connection is pretty fast. The fallowing connections need more than a second.
I next I Tested my client against a netcat server, which was launched by nc -vkl localhost $PORT
. Lets take a look to that outout:
Total time = 0.000127
Total time = 0.000049
Total time = 0.000050
This is really awesome. Every connection is pretty fast. So I think there is an issue in my Server code above. In the wireshark log you can see, that there is a [RST, ACK] Message and an timeout of about 1000ms.
Does anybody know how to solve this issue?