首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

关于Socket通讯

2012-11-06 
关于Socket通讯求助现在在做一个GPRS通讯的DLL,里面有一个连接点的信息数据结构:DtuClientsStruct recor

关于Socket通讯求助
现在在做一个GPRS通讯的DLL,里面有一个连接点的信息数据结构:  
DtuClientsStruct = record //DTU连接信息
  soc: TSocket; //Socket
  zid: Integer; //ID 
  add: sockaddr_in; //IP
  todaytime: TDateTime; //登录时间
  refreshDT: TDateTime; //刷新时间
  end;

还有个保存数据的数据结构:
  DtuDataStruct = Record //DTU数据域
  add: sockaddr_in; //IP
  m_modemId: Int64; //ID号
  m_recv_time: TDateTime; //接收时间
  m_data_buf: Array[0..MAX_RECEIVE_BUF] of Byte; //数据缓存
  m_data_len: Word; //数据长度
  m_data_type: Byte; //数据类型
  m_end_pointer: Integer; //
  end;

Socket连接好后我listen,并有连接线程在运行,有连接过来就会增加一个Tlist的DtuClientsStruct ,保存soc、

add及连接时间,当这个连接建好后收到的数据会增加一个TList的DtuDataStruct ,保存收到的数据、长度等,

但是发现一个问题,一旦网络异常导致重连,这样一来accept返回的TSocket以及IP地址都会变,这样一来上面

两个结构就没有一个可以关联的东西了,我是感觉我的这个设计有问题,但是因为第一次做不知道怎么很好的

来解决这个问题,请教熟悉这方面操作的朋友,我这两个结构怎么来关联?或者怎么设计比较合理?


[解决办法]
建立一个session机制,如果客户端连接时候没有session那么请求服务器端分配一个session,这个session作为一个字段保存在DtuClientsStruc中,断线重连后客户端首先发送这个session,如果服务器端上存在那就可以获取相应数据。
[解决办法]
两个结构的ID是作什么用的?
[解决办法]

探讨

建立一个session机制,如果客户端连接时候没有session那么请求服务器端分配一个session,这个session作为一个字段保存在DtuClientsStruc中,断线重连后客户端首先发送这个session,如果服务器端上存在那就可以获取相应数据。

[解决办法]
定义这两个结构的全局变量, DtuClientsStruct 和 DtuDataStruct 都放一个 socket 句柄,初始值设置为无效值INVALID_SOCKET.当有客户连接进来,你会调用 accept,在你的全局变量中查找一个有无效句柄的项,把accept返回值记录在里边.当客户关闭连接时,你在全局变量中找到这个socket,把对应的socket句柄重新设置为INVALID_SOCKET.这样就可以了.有一本新书《WinSock网络编程经络》,你可以参考第19章MSP程序.
源码下载地址:http://download.csdn.net/detail/geoff08zhang/4571358

热点排行