添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

在linux上用C语言处理多线程TCP服务器的最佳方法

1 人关注

我在这里读到了关于这个话题的很多不同的方法,我想知道 "用C和多线程创建Linux TCP服务器 "的最佳做法是什么。

到目前为止,我已经读了:

1-复制过程,用Fork()。

2-为每个客户创建分离的线程。 用C语言实现多线程服务器/客户端

3-为每个连接创建异步线程

我读到过,每个连接的叉子和线程都不是最佳做法,但是,我不确定什么才是真正的做法?

我有一个小型服务器,每个连接都有异步线程,我在bind()的时间上有问题,如果我杀死进程并再次启动它,它需要5分钟才能再次启动,因为我得到了" ERROR on binding:我决定解决这个问题,但要遵循最佳实践。

非常感谢,并对我的英语感到抱歉。

3 个评论
关于你的使用中地址错误,你可能想 阅读此文 .
Duck
你错过了可能是最常见、最有用、最容易编码的方法--用 select poll/epoll 进行复用。
而且你错过了使用线程池。
c
linux
multithreading
tcp
tcpserver
Luis Rubiera
Luis Rubiera
发布于 2014-10-01
3 个回答
Willian Mainieri
Willian Mainieri
发布于 2014-10-01
已采纳
0 人赞同

关于你的问题的约束力...

设置选项SO_REUSEADDR,以使绑定到一个已经在使用的端口(在某些情况下)。在绑定之前设置它。

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));
user207421
user207421
发布于 2014-10-01
0 人赞同
  • Is obsolete since the introduction of threads.
  • This is the most widely used technique.
  • You've misread this. You can use asynchronous I/O, but it's a complex programming model and not to be entered into lightly.
  • You left out non-blocking I/O with select(), poll(), epoll().
  •