您现在的位置:首页 > 教案模板 > 正文

linux socket函数参数_linux socket函数详解_socket()函数(7)

2019-07-23 06:06 网络整理 教案网
$ ./echoclient2.py localhost "Hello world" 7
Received: Hello world [0]
Received: Hello world [1]
Received: Hello world [5]
...
Received: Hello world [16]
37.07 seconds
与前面的多线程客户机一样,线程不一定以它们被启动的顺序连接。然而最值得注意的是,为20个线程提供服务所花的时间基本上是在通过socket逐个地写出字节时引入的所有延时之和,37秒多。这里服务器没有什么是并行化的,因为我们需要等待每个单独的socket连接完成其任务。

下面是异步服务器,使用select()来多路复用socket。看它如何避免我们刚才客户机引入的那种延时(或者由于确实很慢的连接而频繁产生的那种延时)。

#!/usr/bin/env python
from socket import *
import sys, time
from select import select
if __name__=='__main__':
    while 1:
        sock = socket(AF_INET, SOCK_STREAM)
        sock.bind(('',int(sys.argv[1])))
        print "Ready..."
        data = {}
        sock.listen(20)
        # 等待20个客户连接
        for _ in range(20):
            newsock, client_addr = sock.accept()
            print "Client connected:", client_addr
            data[newsock] = ""
        # 上一次有活动socket的时刻
        last_activity = time.time()
        while 1:
            # 多路复用方式监控20个socket连接,TCP连接是双工的,可读可写
            # 因此可读socket集合与可写socket集合相同
            read, write, err = select(data.keys(), data.keys(), [])
            # 若超过5秒还没有活动的socket,则彻底关闭所有连接
            if time.time() - last_activity > 5:
                for s in read: s.shutdown(2)
                break
            for s in read:
                data[s] = s.recv(32)
            for s in write:
                if data[s]:
                    last_activity = time.time()
                    s.send(data[s])
                    data[s] = ""
我们的异步服务器先通过accept接收所有的20个连接请求,然后在主循环中通过多路复用方式不间断地监控这20个连接。当select()返回时,可读连接列表将被修改,指示某个连接已经准备被读取。读取其中各个连接中数据,然后写回去。如果超过5秒还没有活跃的连接,则释放所有连接。

这个服务器比较简单,因为它是在等待准确的20个客户机连接之后再用select()去监控。但是它仍然说明了使用密集的轮训循环,以及仅当数据在特定的socket上可用时才读/写数据的的基本概念。select()的返回值分别是可读、可写和错误的socket列表的三元组。这其中的每一种类型都是根据需要在循环中处理的。

顺便说一句,使用这种异步服务器允许“慢速连接”客户机在大约6秒的时间内完成全部20个连接,而不是需要37秒(至少在我的测试系统上是这样)。

“现在的程序编写朝着越来越冗长庞大的方向发展,而c语言虽然属于相对‘低级’的编程语言,但它的简洁之美是无可替代的。然而定义枚举类型的方式却不太简洁,要依如下语法编写:。像前文所说lua语法简洁优美,解释器由标准c编写。

6、结束语

本教程中介绍的服务器和客户机很简单,但是它们展示了用C和Python编写Socket应用程序所必需的每一方面。更高级的客户机或服务器本质上不过是来回地传输更有趣的数据;socket层的代码和本文中的这些例子并没有什么不同。

执行线程化、分支和异步socket处理的一般要点可类似地应用于更高级的服务器。您的服务器和客户机本身可能会做更多的事情,但是针对可扩展性的策略始终是这三种方法之一(或者它们的组合)。

参考文献:

Linux Socket编程(不限Linux):

Linux socket 编程,第一部分:

Linux socket 编程,第二部分: