| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2080 人关注过本帖
标题:[求助]Sock还是NetWorkStream验证?
取消只看楼主 加入收藏
jockey
Rank: 3Rank: 3
等 级:论坛游民
威 望:8
帖 子:977
专家分:52
注 册:2005-12-4
结帖率:33.33%
收藏
 问题点数:0 回复次数:10 
[求助]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
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
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
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
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
jockey
Rank: 3Rank: 3
等 级:论坛游民
威 望:8
帖 子:977
专家分:52
注 册:2005-12-4
收藏
得分:0 
刚才出的错误是在服务器端发生的。
它不能同时进行
socketForClinet = tcpListener.AcceptSocket()怎么办?

2007-02-01 15:08
jockey
Rank: 3Rank: 3
等 级:论坛游民
威 望:8
帖 子:977
专家分:52
注 册:2005-12-4
收藏
得分:0 

服务器不能同时对同一端口进行两个Listen!
哎就这句话出错了啊!
socketForClinet = tcpListener.AcceptSocket()


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

老大:你还是帮我看看代码吧:
private TcpListener tcpListener=new TcpListener(1234);

private void Listen()
{
tcpListener.Start();
socketForClinet = tcpListener.AcceptSocket();
try
{
if (socketForClinet.Connected)
{
while (true)
{
sl = true;
networkStream = new NetworkStream(socketForClinet);
streamReader = new StreamReader(networkStream);
string ss=streamReader.ReadLine();
//验证密文
if (ss !="888")

{
socketForClinet.Close();
return;
}

socketForClinet.Send(ms.GetBuffer());//合法用户可以传送数据了
//关闭连接
socketForClinet.Close();
tcpListener.Stop();
//继续传下一个文件:

Thread SecThread = new Thread(new ThreadStart(Listen));
SecThread.IsBackground = true;
SecThread.Start();
}
}
}
catch(Exception ey)
{
MessageBox.Show(ey.ToString());
}

}


2007-02-01 16:49
jockey
Rank: 3Rank: 3
等 级:论坛游民
威 望:8
帖 子:977
专家分:52
注 册:2005-12-4
收藏
得分:0 
现在的问题是,第一次合法用户连接好用。但如果第一个是非法用户(密码不同),则后面的连接就无效了!
也就是这个地方:
if (ss !="888")
{
socketForClinet.Close();
return;//它不能继续监听了!!!
}
如果在retrun前面加上代码:
Thread SecThread = new Thread(new ThreadStart(Listen));
SecThread.IsBackground = true;
SecThread.Start();
那就出错了!

2007-02-01 16:55
快速回复:[求助]Sock还是NetWorkStream验证?
数据加载中...
 
   



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

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