Luis Rubiera
Luis Rubiera

Reputation: 17

best way to deal with multithreading TCP Server with C on linux

i've read here about this topic in a lot of differents ways, and i want to know whats the best practices of "creating a Linux TCP server with C and Multithreading".

so far i've read :

1-Duplicating process, with Fork().

2-Creating separated threads for each client. multithread server/client implementation in C

3-Creating Asynchronous threads for each connection

i've read that Fork and thread for each connection are not best practices, but, im not sure what really is one?

i have a small server with asynchronous threads for each connection and i have problems with bind() in the time, if i kill the process and start it again, it need like 5 minutes to start again, because i get " ERROR on binding: Address already in use " and i decided to fix it, but with the best practices.

many thanks in advance and sorry for my english .

Upvotes: 1

Views: 2715

Answers (3)

Willian Mainieri
Willian Mainieri

Reputation: 39

Regarding your problem binding..

Set the option SO_REUSEADDR to enable binding to a port already in use (under certain circumstances). Set it before bind.

now it will work fine

...
servSock=socket(PF_INET,SOCK_STREAM,IPPROTO_TCP);
int optval = 1;
setsockopt(servSock,SOL_SOCKET,SO_REUSEADDR,(void *)&optval,sizeof(optval));
/* Construct local address structure */
memset(&echoServAddr,0,sizeof(echoServAddr));   /* Zero out the structure */
echoServAddr.sin_family=AF_INET;                /* Internet address family*/
echoServAddr.sin_addr.s_addr=htonl(INADDR_ANY); /* Any incoming interface */
echoServAddr.sin_port = htons(echoServPort);    /* Local port */
/* Bind to the local address */
bind(servSock, (struct sockaddr *) &echoServAddr, sizeof(echoServAddr));
...

Upvotes: 3

ciphor
ciphor

Reputation: 8288

I would suggest you to read the doc & code of libev, that is state-of-the-art.

Upvotes: 0

user207421
user207421

Reputation: 311039

  1. Is obsolete since the introduction of threads.
  2. This is the most widely used technique.
  3. You've misread this. You can use asynchronous I/O, but it's a complex programming model and not to be entered into lightly.
  4. You left out non-blocking I/O with select(), poll(), epoll().

If you know what you're doing and you expect very high load you should investigate 3 or 4. Otherwise you should start with 2, as it's the easiest to program and get working, and see by observing it in production whether you have a capacity problem. Odds are than you will never need to progress beyond this model.

Upvotes: 0

Related Questions