CSocket编程数据接收不全 同步异步还是接收处理有有关问题
CSocket编程数据接收不全 同步异步还是接收处理有问题


直接编辑有问题所以截图了
------解决思路----------------------
tcp是基于流的,没法保证客户端一次发送的,服务端肯定一次能收到
所以仅接收一次处理是不够的,接收必须是循环进行,直到接收完整为止。
如何判定完整?需要在业务层做约定,一般都是先发送数据包长度过来,
服务器根据包长判定接收是否完成。
------解决思路----------------------
TCP是流,没有边界,你需要确切的知道所要接收的数据的总共大小是多少。
------解决思路----------------------
你这种没有层次的程序,在处理异步数据时应该是不安全的,接收不全正常啊。
你可以将程序的通信与数据处理放在不同的层次不同的线程中完成。例如:当响应接收事件时,立即读出数据(TCP数据不会太大,不需要用10K),读入后申请一块内存将数据转存,用消息发给处理程序即可。
------解决思路----------------------
简单的数据发送接收你可以写死,应用级软件肯定是不可以写死的
一般的做法儿是通过类似于两次通信的模式,第一次把数据长度发过来,服务器就知道要接收的数据大小了,然后while循环接收数据
------解决思路----------------------
自己定义协议,发数据前先发一个数据头(固定大小)过去,告诉对方我要传多大的数据,接收方先收到数据头(固定大小),然后得到到后面还有多大的数据,再用一个while循环把数据接收完即可。
直接编辑有问题所以截图了
------解决思路----------------------
tcp是基于流的,没法保证客户端一次发送的,服务端肯定一次能收到
所以仅接收一次处理是不够的,接收必须是循环进行,直到接收完整为止。
如何判定完整?需要在业务层做约定,一般都是先发送数据包长度过来,
服务器根据包长判定接收是否完成。
------解决思路----------------------
TCP是流,没有边界,你需要确切的知道所要接收的数据的总共大小是多少。
------解决思路----------------------
你这种没有层次的程序,在处理异步数据时应该是不安全的,接收不全正常啊。
你可以将程序的通信与数据处理放在不同的层次不同的线程中完成。例如:当响应接收事件时,立即读出数据(TCP数据不会太大,不需要用10K),读入后申请一块内存将数据转存,用消息发给处理程序即可。
------解决思路----------------------
简单的数据发送接收你可以写死,应用级软件肯定是不可以写死的
一般的做法儿是通过类似于两次通信的模式,第一次把数据长度发过来,服务器就知道要接收的数据大小了,然后while循环接收数据
------解决思路----------------------
自己定义协议,发数据前先发一个数据头(固定大小)过去,告诉对方我要传多大的数据,接收方先收到数据头(固定大小),然后得到到后面还有多大的数据,再用一个while循环把数据接收完即可。