关于C# Socket Handle 的问题

public class SessionId
{
private int _id;
public int ID
{
get
{
return _id;
}
}

public SessionId(int id)
{
_id = id;
}
}
private SessionId _id;//SessionId 是自定义的一个类
private Socket _cliSock;
_id = new SessionId((int)_cliSock.Handle);
各位大神,有几个问题:
1、我现在调试代码的时候,_id直接显示的是1400,这是什么原因?
2、 我需要_id从1开始显示,该怎么做?
3、我用的是sessionTable.Add(newSession.ID, newSession),如何将IP与newSession.ID一一对应起来?

具体代码可见此处:
http://blog.csdn.net/yangjundeng/article/details/321920
最新回答
深情是罪

2024-10-11 14:11:28

1. _cliSock.Handle使用的是socket底层句柄 这是由操作系统分配的 无法确定是多少 每次都不一样

2. 使用一个自增的计数器 作为id使用 比如...

// 这是一个线程安全的计数器...
class Counter {
public Counter(int startValue) {
this.value=startValue-1;
}
private int value;
public int NextValue{
get{return Interlocked.Increment(ref value);}
}
}
...

static Counter c = new Counter(1);
...

private SessionId _id;
private Socket _cliSock;
_id = new SessionId(c.NextValue);

3. 用foreach对整个sessionTable进行迭代查询  事实上在我的代码里也是这样做的... 如果这样的查询十分频繁 请用ip地址作为key...

追问
那我就不用socket.handle啦!

还有两个问题呢,麻烦你了!~O(∩_∩)O~
1、我把客户端的一些信息存储在Hash表中了。如果A客户端与服务端连接后(ID号记为1),然后断开连接,是不是A客户端的信息就从Hash表中移除了?如果A再次连接服务端,此时A的ID号还是1吗?

由于这边字数的限制,第二个问题就在评论里了。谢谢!!!
追答
  1. 断开连接后请手动在hash表中移除  它没有理由自动移除 再次连接的话会视为是另外一个client socket  应该赋予一个新的id

  2. 为listbox中的项写一个自定义类 然后关联id或者关联sessionID对象即可  这个可以参考你自己以前见过的类似软件设计 好像没什么特别的思路  甚至你干脆把sessionID重写tostring方法扔到listbox都可以。。

追问
第一个问题和第二个问题结合一下,如果我把A客户端跟checklistbox中的第一项始终绑定,B客户端跟第二项始终绑定,C客户端始终跟checklistbox第三项绑定。。。。这样的话关联id不就不可以了么,因为每一个客户端关联的id在是不固定的。             你说,这个可以关联ip吗?
追答
唔...关联哪个都一样...  只是我觉得直接关联客户端对象最方便   当然关联id也可以 ip也可以 但是获取的时候要多费一步
追问
嗯嗯,但是嘞,直接关联客户端对象具体怎么弄呢?还是不是很明白呢。。。。
追答
listbox是支持数据绑定的控件 每一个item都可以为object  所以你直接把处理客户端类的SessionId对象add进去即可  获取checkedItems的时候直接进行类型转换
你可以通过重写SessionId类的ToString方法来改变他在控件中显示的文字... 详细参考控件用法