问一个极其基本的问题(50分)

  • 主题发起人 主题发起人 masm
  • 开始时间 开始时间
M

masm

Unregistered / Unconfirmed
GUEST, unregistred user!
我用setsockopt(FSocket,SOL_SOCKET,SO_RCVTIMEO,@TimeOut,SizeOf(TimeOut));
设置了socket超时,问题来了,发送一个数据报a,接收超时后,发送数据报b,那么这个时候接收服务器返回的数据报是回答a的呢,还是回答b的?
 
这应该是通讯协议定义的问题了.如果向你这样说.如果使用完成端口来接收数据,多个线程来处理,肯定有报文接收顺序的问题.由于线程调度,可能先收到的数据是对方后发送的.而对方先前发送的数据却晚到了.这时只能从通讯协议上来分析这块数据怎么处理.
 
谢谢回答!
我的问题是:
当我用setsockopt()函数设置了超时,那么,这个socket在超时后,是不是会把原本超时前就应当到达的所有数据都被系统核心忽略掉?
如果不是,那我只能把这个Socket关闭,重新建立。那样应当会把原先的socket返回数据被网卡扔掉吧。
咳。现在的书都是你抄我我抄你,没一个能有自己理解的。哪位大虾是搞网卡驱动的?看一下汇编代码什么问题都解决了。
 
知道楼主是位大虾,汇编很是牛X,所以再瞎说几句.
我的理解是setsockopt 设置超时只是为了解决阻塞方式下的socket编程,当指定的时间里没有数据返回,recv调用就返回.如果是楼主说的那样,这个连接就失效了,我觉得不应该是.
希望哪位理解比较透彻来给解释一下.
 
做了个测试.
1首先udp肯定没有问题.
2.tcp 写了个测试程序.超时之后,没有问题,可以收到以前的数据.
 
目前用INDY比较多 传统的SOCKET用的少了

一般SOCKET应答是有个时间要求的 超时就不接收了。
 
这么说,一旦这个socket出现超时了,只能关闭释放了。
如果继续使用这个socket,再次发送请求,那么如果接收到返回数据,也搞不清是超时前那个请求的应答还是刚才那个请求的应答(当然,我无法定义接收数据包)?
 
你有这个问题是因为你处理不好多线程的问题,SOCKET服务端对每个连接的客户端开一个线程,这样就不会有你说的问题。
建议你还是使用INDY,它本身就是多线程,根本不用考虑这些问题
 
这个问题跟多线程一点关系也没有。
我再明确一下我的问题。
我用socket获取网页源代码。已经发送get请求报,开始接收服务器应答报,接收到一半,发生超时错误。如果我继续使用这个socket,发出另一个网页的get请求报,如果有数据到达,是上一网页源代码的还是现在这个网页源代码?
 
后退
顶部