LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
楼主: kj501

试着编写了一个客户-服务器程序

[复制链接]
 楼主| 发表于 2003-4-10 09:44:42 | 显示全部楼层
1。用fork或者thread了可以啊。但在linux下thread和fork的开销差别不是很大。而且采用多进程方式,一旦服务器端的程序很大(如数据库服务器),同时有多个连接时,系统的开销太大,这时用select进行异步I/O处理要合适一些。
2。服务器只重定向标准输出(文件描述符为1)和标准错误输出(文件描述符为2),标准输入(文件描述符为0)没有被重定向,但是也没有使用标准输入。因为数据的输入是从socket读取的。
3。本来应该是客户端输入命令后,就应该能马上看到服务器的执行结果。但不知道什么原因,出现了迟滞现象,可能是缓冲区的关系吧,在我这个程序里确实要执行下一个命令,才能看到上一步的执行结果。
 楼主| 发表于 2003-4-10 09:46:01 | 显示全部楼层
编写了这个程序之后,对于端口的概念还是有点迷糊,如果一个端口对应一个进程,在单机上运行多个客户,使用的是同一个端口,套接字如何区分不同的客户?
如果能够有办法区分不同的进程,同时运行两个服务器进程为什么又不行呢?
发表于 2003-4-10 23:13:35 | 显示全部楼层
对不起,看错了,是标准输出和标准错误。:)
再随便问问,如果客户想要执行的命令需要输入怎么办呢?比如需要用户确认一个 yes/no 的情况。
如果是听一个端口,那么这个端口号码在制定的IP地址上就只能有一个服务器程序听。但是,连上了一个客户的时候,一旦 accept 以后连接就成了一对儿了,从服务器这段到不同的客户端的就不会错了。

Linux 使用 select 一次可以监视 1024 个文件描述符,似乎看起来也够用了。
发表于 2003-4-11 00:03:53 | 显示全部楼层
最初由 kj501 发布
编写了这个程序之后,对于端口的概念还是有点迷糊,如果一个端口对应一个进程,在单机上运行多个客户,使用的是同一个端口,套接字如何区分不同的客户?
如果能够有办法区分不同的进程,同时运行两个服务器进程为什么又不行呢?

服务器Accept之后还要给每一个client分配一个端口的,这个端口号是合不相同的。
发表于 2003-4-11 03:58:24 | 显示全部楼层
我觉得客户端那个端口号码在客户端 connect() 的时候就定下来了。还有,如果服务器随便就能给我的机器分配一个号码,那我不是没有 privacy 了么。:)
 楼主| 发表于 2003-4-11 07:49:11 | 显示全部楼层
最初由 viper 发布

再随便问问,如果客户想要执行的命令需要输入怎么办呢?比如需要用户确认一个 yes/no 的情况。

确实存在这个问题,看来还要把标准输入重定向到socket。
 楼主| 发表于 2003-4-11 08:07:31 | 显示全部楼层
最初由 TecHunter 发布

服务器Accept之后还要给每一个client分配一个端口的,这个端口号是合不相同的。

思考一下,有些明白了。
套接字应该由5个部分组成,包括协议,发送方IP地址和端口,接收方IP地址和端口。比如说IP地址为202.120.23.45的服务器在端口21侦听,与些同时在IP地址为203.132.32.54客户机上有一个TCP进程想要与服务器连接,于是利用一个没被占用的端口号2233组成一个套接字向服务器发出连接申请,这时的套接字应该是tcp,  202.120.23.45, 21,
203.132.32.54, 2233,当服务器accept之后,要形成一个新的套接字。并同时给这个套接字分配一个没有被占用的服务器端口号,比如说3433,因此套接字就变成为tcp,  202.120.23.45,3433, 203.132.32.54, 2233,以这个套接字继续与客户连接。而原来占用的端口21,则被空闲出来以供新的连接使用。这样,即使客户端有多个套接字想同的连接请求,服务器也能用不同的套接字把它们区分开来。
不知道我这样的理解是否正确,请各位兄弟指点。
发表于 2003-4-11 08:52:48 | 显示全部楼层
最初由 kj501 发布

思考一下,有些明白了。
套接字应该由5个部分组成,包括协议,发送方IP地址和端口,接收方IP地址和端口。比如说IP地址为202.120.23.45的服务器在端口21侦听,与些同时在IP地址为203.132.32.54客户机上有一个TCP进程想要与服务器连接,于是利用一个没被占用的端口号2233组成一个套接字向服务器发出连接申请,这时的套接字应该是tcp,  202.120.23.45, 21,
203.132.32.54, 2233,当服务器accept之后,要形成一个新的套接字。并同时给这个套接字分配一个没有被占用的服务器端口号,比如说3433,因此套接字就变成为tcp,  202.120.23.45,3433, 203.132.32.54, 2233,以这个套接字继续与客户连接。而原来占用的端口21,则被空闲出来以供新的连接使用。这样,即使客户端有多个套接字想同的连接请求,服务器也能用不同的套接字把它们区分开来。
不知道我这样的理解是否正确,请各位兄弟指点。

应该就是这样的了.
其实你开一个FTP服务,然后看每一个连接的端口就知道了.应该改都不是21.
发表于 2003-4-11 10:08:20 | 显示全部楼层
I can't input Chinese here.
But, that is not correct,  when the server accept() that connection, the port number on the server side is still 21 (for that FTP server).
 楼主| 发表于 2003-4-11 10:13:51 | 显示全部楼层
端口21是用来连接新的socket的。一旦连接成功,服务器会给这个新的socket分配一个没有使用的新端口号,而原来的端口21被空闲出来给下一个连接。如果原来的连接继续占用端口21,那么新的连接必须等到原来的连接结束后,才能使用端口21。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表