TCP网络编程有三个例子最值得学习研究,分别是echo、chat、proxy。
echo的作用:熟悉服务端被动接受新连接、收发数据、被动处理连接断开。每个连接是独立服务的,连接之间没有关联。在消息内容方面echo有一些变种:比如做成一问一答得方式,收到的请求和发送响应的内容不一样,这时候要考虑打包与拆包格式的设计,进一步还可以写成简单的HTTP服务。
chat的作用:连接之间的数据有交流,从a收到的数据要发给b。这样对连接管理提出了更高的要求:如何用一个程序同时处理多个连接?fork()-per-connection似乎是不行的。如何防止串话?b有可能随时断开连接,而新建立的连接c可能恰好复用了b的文件描述符,那么a会不会错误地把消息发给c?
proxy的作用:连接的管理更加复杂:既要被动接受连接,也要主动发起连接;既要主动关闭连接,也要被动关闭连接。还要考虑两边速度不匹配。
这三个例子功能简单,突出了TCP网络编程中的重点问题,挨着做一遍基本就能到基础层次。chat例子如腾讯的qq,今天发现一个很好的范强软件lantern,就是proxy的应用。另外推荐两个学习socketAPI的神器:IPython、netcat。IDE用CLion,不要太好用。
Linux服务端编程有多种模型:多进程、多线程、select poll epoll等多路IO复用。
首先梳理一下TCP服务端多线程模型:
void *worker(void *arg) { int client = *((int *)arg); while (read(client) > 0) { write(client); } close(client); } int main() { socket(); bind(); listen(); while (1) { int client = accept(); if (client > 0) { pthread_t pt; pthread_create(&pt, NULL, worker, &client); } } }
echo既是将从客户端读到的数据原封不动的写回客户端,或者加以处理写回。
原文:http://www.cnblogs.com/xuelei/p/6681534.html