最后的15分了,clientsocket连续发送的有关问题
最后的15分了,clientsocket连续发送的问题
最近在改造老的项目,增加分包发送的代码,现在出现这个问题
项目用tclientsoet,tserversocket来搭建,非阻塞模式,这些都是固定的,没法变动
1.
将一个大的数据包,比如6000个字节,分为30个小包发送,用一个
while(...)
{
......
int p=clientsocket->sendbuf(....)//在这里检查p的值,都是正常的值,没有等于-1的
if(p==-1)
{
OutPutDebugString(....)
}
}
用上面的代码,基本上,在服务器上接受的时候,总会出现数据包验证不通过的问题,抓包,发现时乱码,如果再sendbuf后面加一个sleep(1),就正常了,为什么呢?senbuf返回值是正常的,没有为-1,为什么一定要加上sleep(1)呢?又没有出现发送错误
2.如果再服务器端处理的时候,客户端断开了连接,处理数据的过程中需要发送数据,在引用socket->handle的时候,会出现非法操作,如何避免这样的问题?如何判断?本来客户端断开,服务器端会收到一个消息,在这里做处理就可以了,但是,如果服务器端正在处理的时候断开,服务器端正在处理数据,等处理好了以后才会接受到断开的消息,怎么样能避免非法操作呢?
------解决方案--------------------
有两点不明白:
1、6000个字节,如果是不可分隔的,为什么要分,一次性发过去就行了;
2、既然要分,必须保证服务端能正确区分每个包,因此,每个包应该加控制信息,例如:固定长度的包头+数据,接收时先接收包头,然后根据包头再接收数据,这样就不会乱。
最近在改造老的项目,增加分包发送的代码,现在出现这个问题
项目用tclientsoet,tserversocket来搭建,非阻塞模式,这些都是固定的,没法变动
1.
将一个大的数据包,比如6000个字节,分为30个小包发送,用一个
while(...)
{
......
int p=clientsocket->sendbuf(....)//在这里检查p的值,都是正常的值,没有等于-1的
if(p==-1)
{
OutPutDebugString(....)
}
}
用上面的代码,基本上,在服务器上接受的时候,总会出现数据包验证不通过的问题,抓包,发现时乱码,如果再sendbuf后面加一个sleep(1),就正常了,为什么呢?senbuf返回值是正常的,没有为-1,为什么一定要加上sleep(1)呢?又没有出现发送错误
2.如果再服务器端处理的时候,客户端断开了连接,处理数据的过程中需要发送数据,在引用socket->handle的时候,会出现非法操作,如何避免这样的问题?如何判断?本来客户端断开,服务器端会收到一个消息,在这里做处理就可以了,但是,如果服务器端正在处理的时候断开,服务器端正在处理数据,等处理好了以后才会接受到断开的消息,怎么样能避免非法操作呢?
------解决方案--------------------
有两点不明白:
1、6000个字节,如果是不可分隔的,为什么要分,一次性发过去就行了;
2、既然要分,必须保证服务端能正确区分每个包,因此,每个包应该加控制信息,例如:固定长度的包头+数据,接收时先接收包头,然后根据包头再接收数据,这样就不会乱。