标题:[求助]Sock还是NetWorkStream验证?
只看楼主
jockey
Rank: 3Rank: 3
等 级:论坛游民
威 望:8
帖 子:977
专家分:52
注 册:2005-12-4
结帖率:33.33%
 问题点数:0 回复次数:16 
[求助]Sock还是NetWorkStream验证?

各位老大:
我想实现这种功能:服务器端储存了一些多媒体信息并进行端口监听等待客户端连接,客户端通过验证后,服务器就开始发送媒体流(图像、声音等),客户端接收服务器端不断传过来的流进行显示或播放。
我现在的问题是:
1、如何对客户端进行验证?(不能通过数据库)
2、连续不断的流如何进行收发?(我做了测试,每次连接只能发送或接收一次流,连续的流就必须重新进行一次连接)

服务端监听:

tcpListener = new TcpListener(1234);
tcpListener.Start();
socketForClinet = tcpListener.AcceptSocket();//想加一个验证,只有特定用户才允许连接,否则,只要知道IP及端口的客户端都可以连接了
try
{
if (socketForClinet.Connected)
{

listBox1.Items.Add("已经和客户端连接成功!");//必须调用该委托

while (true)
{.........

[此贴子已经被作者于2007-1-28 20:21:30编辑过]

搜索更多相关主题的帖子: Sock 验证 
2007-01-28 16:22
swc
Rank: 3Rank: 3
等 级:论坛游民
威 望:6
帖 子:394
专家分:83
注 册:2006-4-7
得分:0 
不能accept后再验证吗?验证不通过再把连接关闭.

实践、学习、再实践、再学习......
2007-01-28 17:09
jockey
Rank: 3Rank: 3
等 级:论坛游民
威 望:8
帖 子:977
专家分:52
注 册:2005-12-4
得分:0 

你是说在这里验证么?How?
if (socketForClinet.Connected)
{

if (非法用户) //验证用户。但是怎样来验证呢?对数据流进行验证么?如果获取的流符合条件,那么就继续,但是这个流是连续不断的发包...
{socketForClinet.Close;
return;}
while (true)
{.........


2007-01-28 19:56
swc
Rank: 3Rank: 3
等 级:论坛游民
威 望:6
帖 子:394
专家分:83
注 册:2006-4-7
得分:0 
((IPEndPoint)socketForClinet.RemoteEndPoint).Address.ToString();//这个表示远程主机地址
((IPEndPoint)socketForClinet.RemoteEndPoint).Port.ToString();//这个表示远程主机端口

实践、学习、再实践、再学习......
2007-01-28 23:01
jockey
Rank: 3Rank: 3
等 级:论坛游民
威 望:8
帖 子:977
专家分:52
注 册:2005-12-4
得分:0 
多谢swc!

2007-01-29 09:05
jockey
Rank: 3Rank: 3
等 级:论坛游民
威 望:8
帖 子:977
专家分:52
注 册:2005-12-4
得分:0 

现在可以根据客户端IP进行验证了!不过问题是客户端的IP可能是变动的(特别对于PPPoe拨号用户),又怎么来验证呢?
如果连接的时候能判断一下口令就棒了。
能不能这样:首次连接的时候客户端发送密码过来,服务器端进行验证,验证通过以后,再往客户端发送数据流。

客户端发送验证口令:
ns =myclient.GetStream();
streamWriter = new StreamWriter(ns);
streamWriter.WriteLine(textPwd.Text);

但是如果服务器端通过验证后发送过来的Stream再显示就有问题了
netStream = myclient.GetStream();//因为也要用到这句话啊,这个时候的Stream已经改变了。

能不能用两个线程:
客户端:
一个线程发送验证
一个线程用来接收
服务器端:

用两个线程监听同一个端口:
一个用来验证客户端的合法性(如果合法则保存客户端IP)
另一个线程判断是否是线程1保存的IP,如果是才发送数据流

有弄过的大虾么?请指点一下,谢谢!


2007-02-01 12:37
swc
Rank: 3Rank: 3
等 级:论坛游民
威 望:6
帖 子:394
专家分:83
注 册:2006-4-7
得分:0 
我觉得你的思路是对的.不过对你出现的问题我就迷糊了.
为什么你用的是同一个NetworkStream却要两次myclient.GetStream(),只要连接服务器成功,你完全就可以用stream来代替socket或client啦.因为后面涉及的传输操作用stream就OK了.

还有,为什么要独立出一个线程来发送验证?不就是一次的操作吗?

实践、学习、再实践、再学习......
2007-02-01 14:25
jockey
Rank: 3Rank: 3
等 级:论坛游民
威 望:8
帖 子:977
专家分:52
注 册:2005-12-4
得分:0 
未处理 System.Net.Sockets.SocketException
Message="一个封锁操作被对 WSACancelBlockingCall 的调用中断。"
Source="System"
ErrorCode=10004
NativeErrorCode=10004
StackTrace:
在 System.Net.Sockets.Socket.Accept()
在 System.Net.Sockets.TcpListener.AcceptSocket()
在 ScreenClient.Form1.Listen() 位置 C:\temp\ScreenClient\ScreenClient\Form1.cs:行号 186
在 System.Threading.ThreadHelper.ThreadStart_Context(Object state)
在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
在 System.Threading.ThreadHelper.ThreadStart()

2007-02-01 14:57
swc
Rank: 3Rank: 3
等 级:论坛游民
威 望:6
帖 子:394
专家分:83
注 册:2006-4-7
得分:0 


实践、学习、再实践、再学习......
2007-02-01 14:59
jockey
Rank: 3Rank: 3
等 级:论坛游民
威 望:8
帖 子:977
专家分:52
注 册:2005-12-4
得分:0 
谢谢两位!
swc:是这样的,因为客户端发送密文Stream时,首先要连接服务器成功后,GetStream后才能Write密文发给服务器。

服务器验证密文后,发送Stream给客户端。这个时候客户端根据收到的Stream再进行别的操作(接收数据流),也要用到GetStream啊,也就是第一次的GetStream是用来传送密文的Stream。第二次Stream是用来收取服务器发送的Stream的。
两个Stream是不一样的!

2007-02-01 15:06



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-118558-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.402642 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved