客户端程序同时运行多个,怎么能依次向服务端发送connect

xiaohan366 2008-11-29 10:49:31
这个问题实际上是这个帖子http://topic.csdn.net/u/20081118/18/f9ef4c5d-2147-4848-8851-91978539185e.html里的模式二的后续问题,特开一贴,主要是想大家能有针对性的更好地回答我这个问题。不清楚这个模型的,我在描述一遍:
电脑1用来作为发送端,依次向14台电脑发送相同的文件,即电脑1先向第一台客户端电脑发送文件完毕,再接着向第二台电脑发送相同的文件,。。。直到14台电脑都发送完。
由于发送端始终是读取、发送同一个文件,为了避免创建多个socket,使效率比较低下,我用发送端电脑作为服务端,其他14台电脑作为客户端。让服务端电脑始终accept、fread、send循环,每一台客户端就只负责一次connect、fwrite和recv.
问题:1、我现在要同时运行14台客户端程序,由于客户端没有服务端listen和accept阻塞函数,我只要不打开服务端,一运行客户端程序,过一会就提示 无法连接。更别提能同时打开14台客户端程序。我这里应该设置怎样的机制或者函数,来实现这样的效果;
2、按照我这样的想法,是不是我就不能确定服务端是按照什么顺序给客户端发送文件的,是随机给这14台电脑依次传完文件?有没有什么方法可以控制按照我规定的顺序依次给各个电脑传送文件;
3、按照一般想法,是在服务端创建14个socket,依次connect14台电脑,我现在不确定按照我现在这个模式,是不是能在传输效率上比前面这个模型要好些?只是按照一般这样的做法,可以控制传送电脑的顺序,就是发送端的电脑程序明显要多了很多代码。
期待大侠能给予详细回答,感谢!
...全文
409 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaohan366 2008-12-17
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 jourbin 的回复:]
服务器分别作为发送端和客户端,14个接收端的IP都是可知的。我想如果不知道IP,应该没法传送数据吧
服务器端可以不用知道客户端地址,让别人来连他就行了

目的就是为了测得每个节点发送或者接受整个文件的时间
如果只是为了这个,有必要控制顺序嘛,,,疯狂接受,发送就行了

只有14个客户端的话,只要考虑数据吞吐量就行了
[/Quote]
数据吞吐量怎么设置?是不是指的传送的速度?
xiaohan366 2008-12-14
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 jourbin 的回复:]
我觉得lz太急了 ,,,,第1个问题还没解决,马上又出第2,3问题
而且需求还是没有描述清楚,,,连14个接收端的IP对于发送端来说,到底是可知的还是未知的,项目的应用是内网,还是公网
因为问题的解决,是要看问题的情况本身的,不同的问题不同的解决方法
设计也是一样,不同的需求,不同的设计
所以连接方式和顺序控制策略部分我就不参与讨论了,需求都不明确,根本没法谈


至于你提到的上面2种模式(发送端和接收端分别做服务器),时间和…
[/Quote]
服务器分别作为发送端和客户端,14个接收端的IP都是可知的。我想如果不知道IP,应该没法传送数据吧,除非内网的广播?实验是在内网环境下,用了3个不同的网段,通过软件和硬件模拟在外网的丢包、阻塞等环境。目的就是为了测得每个节点发送或者接受整个文件的时间。抛开这些环境不说,这个属于典型的HTTP方式的下载,我要做发送端可以同时给多个接收端 传送文件,是通过同一时刻发送端的端口数量来控制可以给多少个接收端传送文件吗?
qap22 2008-12-14
  • 打赏
  • 举报
回复
ding
jourbin 2008-12-14
  • 打赏
  • 举报
回复
服务器分别作为发送端和客户端,14个接收端的IP都是可知的。我想如果不知道IP,应该没法传送数据吧
服务器端可以不用知道客户端地址,让别人来连他就行了

目的就是为了测得每个节点发送或者接受整个文件的时间
如果只是为了这个,有必要控制顺序嘛,,,疯狂接受,发送就行了

只有14个客户端的话,只要考虑数据吞吐量就行了
xiaohan366 2008-12-13
  • 打赏
  • 举报
回复
接着上面的问题继续提问,期望大虾能回答
如果按照现在的模式,即我把发送端作为服务端一直处在listen和accept状态,客户端只要有请求链接上,我就发送数据。另一种模式,把发送端作为客户端,创建14个socket,接收端作为服务端,这样可以在客户端控制IP地址选择发送给接收端的顺序。第二种模式我是否可以理解时间和空间的效率都不如第一种优?
实际中,这应该算是HTTP、FTP下载的一种模型吧,但不可能做到发送端在同一时刻只给一台电脑传送数据,只有传完这台电脑才传送下一台电脑(这样如果同时有很多接收端要接受数据估计要等很长时间了)。实际当中应该是发送端同时可以给多个接收端发送数据的一部分,有一个发送电脑数量的上限。这个上限数量怎么控制呢?是不是通过控制发送端的端口,即发送端开了几个发送端口就可以同时接收几个接收端的链接?
jourbin 2008-12-13
  • 打赏
  • 举报
回复
我觉得lz太急了 ,,,,第1个问题还没解决,马上又出第2,3问题
而且需求还是没有描述清楚,,,连14个接收端的IP对于发送端来说,到底是可知的还是未知的,项目的应用是内网,还是公网
因为问题的解决,是要看问题的情况本身的,不同的问题不同的解决方法
设计也是一样,不同的需求,不同的设计
所以连接方式和顺序控制策略部分我就不参与讨论了,需求都不明确,根本没法谈


至于你提到的上面2种模式(发送端和接收端分别做服务器),时间和空间应该差不多(当然,不考虑ACCEPT和LISTEN操作的部分,只关心数据发送和接收的部分),因为同样的端口数,同样的网络状况,同样多的数据,同样的SEND和RECV的操作次数

发送电脑数量的控制,,,一句话,,,还是根据需求
系统的应用目的是什么,系统的瓶颈在哪里,,,是连接数?还是数据吞吐量?
根据情况而设计

如果接收端只有14个,,,那应该还好搞吧
jourbin 2008-12-01
  • 打赏
  • 举报
回复
另一个小点的问题就是在这样的模式二下可不可以控制传送的顺序,比如先传送完客户端1,再传客户端2...,因为是让发送文件的电脑作为服务端,它不可能向客户端那样发送数据给固定的IP地址的电脑,所以想知道通过什么方法可以控制传送的顺序?

晕,你要控制顺序,那你要自己设计一个顺序的规则啊,,,客户端要有设定ID的功能(或者代码里写死的),服务器要有管理ID的功能
你如果根据IP来控制顺序,如果IP不是固定的,那根本就是不可能的么


要这14台电脑能达到服务端那种阻塞的状态,不知道实际上可不可能实现,有这样的(阻塞)函数?
这是不可能的,如果你是固定IP,也可以实现,你只要在服务器上登记你的IP就行了
如果是动态IP,那是不可能的
jourbin 2008-11-30
  • 打赏
  • 举报
回复
看了lz的前一个帖子和这个帖子,总体感觉设计怪怪:
一,整个项目的需求不是很明确
1,应用环境局域网还是公网(看了帖子后,个人猜想是用于局域网)
2,设计是否考虑完全,采用模式二,如果C2出现问题,那C2后面的C3,C4,***是不是都不能接收到文件了,这是否允许
3,应答机制,为什么一定要采用ACCEPT 来阻塞?
从设计来看,这应该不是一个商用项目(个人感觉,lz别介意)

关于模型1和2,个人的想法:
一,如果采用模型1
建议参考p2p的模型和技术,个人感觉这是最佳的

二,如果采用模型2
方式1,每一块数据同时发给每个Client(这种方式同时要考虑设计完全,比如C1,C2已经连上来并且发送了一定的数据,这个时候C3连上来了,解决办法有好几种,,,发送中间,有个Client出现网络问题时,解决办法也有好几种,,,,等等等等)
方式2,采用FTP服务器的方式,每个Client自己管自己,服务器不管Client,Client自己上来查询有哪些文件还没下载,哪些文件上次才传了一部分,需要继续下载,等等等等
方式3,就是采用你现在讨论的,一个传完传下一个,但是个人觉得这种方式处理上很简单,解决办法上也有很多,只是个人觉得这种方式并不是最好的


上面的只是个人的一点想法,希望有助于lz开拓思路
鉴于不是很了解该系统的应用环境和具体需求(比如为什么一个要按顺序传),不能给出一些很细的建议
KevinJHoo 2008-11-30
  • 打赏
  • 举报
回复
1、C1,C2,...,C14启动后,当连接失败后,每隔一定时间重连。
2、C的序号是由服务端决定还是客户端标识。假设是客户端标识,则在连接S成功后,发包告诉S,我是第N台C。当所有的C登录成功(或者依次从1,到14,轮留等待相应的C连上)后,S将依次向对应序号的C发送文件。
xiaohan366 2008-11-30
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 jourbin 的回复:]
看了lz的前一个帖子和这个帖子,总体感觉设计怪怪:
一,整个项目的需求不是很明确
1,应用环境局域网还是公网(看了帖子后,个人猜想是用于局域网)
2,设计是否考虑完全,采用模式二,如果C2出现问题,那C2后面的C3,C4,***是不是都不能接收到文件了,这是否允许
3,应答机制,为什么一定要采用ACCEPT 来阻塞?
从设计来看,这应该不是一个商用项目(个人感觉,lz别介意)

关于模型1和2,个人的想法:
一,如果采用模型1
建…
[/Quote]
[Quote=引用 10 楼 jourbin 的回复:]
希望lz把项目的具体需求告诉大家,有助于大家想法有针对性
而不是跟着楼主的思路走,局限于一点

(
举个例子,你这个帖子提到的
问题:1、我现在要同时运行14台客户端程序,由于客户端没有服务端listen和accept阻塞函数,我只要不打开服务端,一运行客户端程序,过一会就提示 无法连接。更别提能同时打开14台客户端程序。我这里应该设置怎样的机制或者函数,来实现这样的效果;

如果是C/S模式,当然需要S程序时时开着,如…
[/Quote]
这个朋友说的很好,其实我这个程序,做到这里应该已经算是完成所要的功能,只不过我前面一直局限于一个狭隘的思维,模式二是作为C/S架构,S服务端肯定得一直打开,而作为C客户端如果一段时间接收不到S服务端反馈回来的信息,肯定是提示错误。我前面想要的是服务端不打开的情况,先让14台客户端先打开,想要这14台电脑能达到服务端那种阻塞的状态,不知道实际上可不可能实现,有这样的(阻塞)函数?
另一个小点的问题就是在这样的模式二下可不可以控制传送的顺序,比如先传送完客户端1,再传客户端2...,因为是让发送文件的电脑作为服务端,它不可能向客户端那样发送数据给固定的IP地址的电脑,所以想知道通过什么方法可以控制传送的顺序?
现在通过这个朋友,的确给我了一些提示,希望后面的大侠也能多提宝贵意见,我也吸取,这里涉及一个文件传输算法,所以想知道大家能有什么更好的方法,能更有效,不管是在局域网还是广域网的环境?或者现在有什么最新、最好、最流行的方式?
谢谢了
jourbin 2008-11-30
  • 打赏
  • 举报
回复
希望lz把项目的具体需求告诉大家,有助于大家想法有针对性
而不是跟着楼主的思路走,局限于一点

(
举个例子,你这个帖子提到的
问题:1、我现在要同时运行14台客户端程序,由于客户端没有服务端listen和accept阻塞函数,我只要不打开服务端,一运行客户端程序,过一会就提示 无法连接。更别提能同时打开14台客户端程序。我这里应该设置怎样的机制或者函数,来实现这样的效果;

如果是C/S模式,当然需要S程序时时开着,如果C端连不上,那一般处理都是给出提示,或者不给提示,在设置好的时间段后再连
而lz的机制和效果又指的是什么???
)
xiaohan366 2008-11-29
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 etz2008 的回复:]
多线程
我觉得这个解决办法
也是效率较高的
服务端一直听
客服端一边就为其创建一线程专门为其收发
这样能够提高效率
当然线程同步也是很重要的
[/Quote]
[Quote=引用 2 楼 wenxy1 的回复:]
注意线程同步就行了。
[/Quote]
1楼说的多线程,是指的我说的一般的思路那种方法吗?我是感觉这样编写代码有点麻烦,创建了14个socket,而且都只用来读取和发送同一个文件。效率估计不是太高。不知是不是真的不高?
另外我怎么做到要使线程同步,我在现在的模型下,客户端要怎么设置可以达到我要的效果?
Wenxy1 2008-11-29
  • 打赏
  • 举报
回复
注意线程同步就行了。
etz2008 2008-11-29
  • 打赏
  • 举报
回复
多线程
我觉得这个解决办法
也是效率较高的
服务端一直听
客服端一边就为其创建一线程专门为其收发
这样能够提高效率
当然线程同步也是很重要的
gellf 2008-11-29
  • 打赏
  • 举报
回复
发送文件机器(Machine_SND),接受文件机器(Machine_RCV)。

Machine_RCV开机后直接SendTo发送机器请求传递文件。
Machine_SND recvfrom并判断为请求文件消息后,把各请求放入一个队列Req_Machine_queue。
这里建议还是Machine_SND做为client,Machine_RCV开启listen。
Machine_SND发现Req_Machine_queue有数据,就connect Machine_RCV in Req_Machine_queue,然后传递文件。
完成后,再从Req_Machine_queue中获取下一个Machine_RCV,直到Req_Machine_queue为空。
xiaohan366 2008-11-29
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 Conry 的回复:]
引用 3 楼 xiaohan366 的回复:
引用 1 楼 etz2008 的回复:
多线程
我觉得这个解决办法
也是效率较高的
服务端一直听
客服端一边就为其创建一线程专门为其收发
这样能够提高效率
当然线程同步也是很重要的

引用 2 楼 wenxy1 的回复:
注意线程同步就行了。

1楼说的多线程,是指的我说的一般的思路那种方法吗?我是感觉这样编写代码有点麻烦,创建了14个socket,而且都只用来读取和发送同一个文件。效率估…
[/Quote]
啊,方式一是P2P模式?好像不是吧!
方式二 可以说是属于C/S模式,但是我这里编程有点问题,不是发送端同时开多过端口,只要一有客户端connect,就创建一个socket,而是规定发送端传送完一台电脑,再给另一台发送connect命令的电脑传送数据。
[Quote=引用 5 楼 hacksouls 的回复:]
参照Trojan的工作方式来做就行了.也没有那么麻烦.
首先你的服务端.就是向14台机器发送文件的这台机器我们定义为"S"吧.其他的依次设为C1,C2,C3...吧.
1.S首先监听一个端口并且等待连接.还有把要发送的文件数据先读出来放在给一下变量.只读一次.为了避免以后再读.反正你就是一个文件.是吧.这些做起来都比较简单吧.
2.C1.C2....一上线就去连接S并且给S发送一个指令..S上接受到一个连接之后并且判断是不是向C1,C2...发送数据的…
[/Quote]
这个朋友好像理解错误了,我的问题是,怎么能控制这14台电脑同时运行,做到发送端S先给C1发送完文件,紧接着就给C2传送文件,然后是C3、C4...
我现在的情况是 不能在服务端没打开之前,不可以同时运行14个客户端,因为客户端里没有像服务端S的ACCEPT那样的阻塞函数,直到等到connect才运行。客户端一运行,而服务端没有运行,客户端程序在 connect处就出现错误(这是正常的),我想怎么设置客户端的程序,要达到客户端的阻塞,即14个客户端可以同时运行,服务器最后运行,再依次给这14个客户端电脑传送文件!
感谢这位朋友
hacksouls 2008-11-29
  • 打赏
  • 举报
回复
参照Trojan的工作方式来做就行了.也没有那么麻烦.
首先你的服务端.就是向14台机器发送文件的这台机器我们定义为"S"吧.其他的依次设为C1,C2,C3...吧.
1.S首先监听一个端口并且等待连接.还有把要发送的文件数据先读出来放在给一下变量.只读一次.为了避免以后再读.反正你就是一个文件.是吧.这些做起来都比较简单吧.
2.C1.C2....一上线就去连接S并且给S发送一个指令..S上接受到一个连接之后并且判断是不是向C1,C2...发送数据的指令.如果是就创建一个线程.把之前读出来的数据发送出去.如果这个连接的套接字你不用了直接close就行了.工作不就完成了.?

Conry 2008-11-29
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 xiaohan366 的回复:]
引用 1 楼 etz2008 的回复:
多线程
我觉得这个解决办法
也是效率较高的
服务端一直听
客服端一边就为其创建一线程专门为其收发
这样能够提高效率
当然线程同步也是很重要的

引用 2 楼 wenxy1 的回复:
注意线程同步就行了。

1楼说的多线程,是指的我说的一般的思路那种方法吗?我是感觉这样编写代码有点麻烦,创建了14个socket,而且都只用来读取和发送同一个文件。效率估计不是太高。不知是不是真的不高…
[/Quote]
lz的方式一就相当于P2P
方式二,就是普通的http下载,可参考http服务的代码

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧