localsocket 传输大量的数据 例如一张图片,localsocket本身的缓冲区大小是有限定的
两个办法: 扩充缓冲区的大小
或者是 接收端分多次接收 然后每一次的都拼装起来
以后将给出第二种方式的源码
2017.11.28今天给出核心的源码如下:
1 void ClientTest::handleData() { 2 int recvLen = 0; 3 char* temp = (char*)malloc(462338*sizeof(char)); 4 FrameData_t* recvData = (FrameData_t*)malloc(224 * 172 * sizeof(FrameData_t)); 5 char* buffer = (char*)malloc(462338*sizeof(char)); 6 7 int expectedLen = 462338; 8 int acceptLen = 462338; 9 int totalRead = 0; 10 while (mQuit == false) { 11 recvLen = read(fd, buffer, acceptLen); 12 if (recvLen <= 0) { 13 continue; 14 } else if (recvLen <= 40) { 15 if (buffer[0] == 'c' && buffer[1] == 'd') { 16 ALOGD("read para success recvLen:%d", recvLen); 17 memcpy(lensPara, buffer + 2, 36); 18 } 19 continue; 20 } else { 21 if (totalRead == 0) { 22 if (buffer[0] == 'a' && buffer[1] == 'b') { 23 memcpy(temp, buffer + 2, recvLen - 2); 24 totalRead += recvLen; 25 acceptLen -= recvLen; 26 } 27 } else { 28 memcpy(&temp[totalRead - 2], buffer, recvLen); 29 totalRead += recvLen; 30 acceptLen -= recvLen; 31 } 32 } 33 34 if (totalRead != expectedLen) { 35 continue; 36 } else { 37 ALOGD("read once success"); 38 memset(recvData, 0, 224 * 172 * sizeof(FrameData_t)); 39 memcpy(recvData, temp, 224 * 172 * sizeof(FrameData_t)); 40 backdata.callback(recvData); 41 totalRead = 0; 42 acceptLen = 462338; 43 } 44 } 45 46 free(temp); 47 free(recvData); 48 free(buffer); 49 }
简单说一下原理:当有大量的数据传输时,recv函数一次接收的数据量是不定的,
例如:期待的一次成功的接收结果是5000字节 recv一次只能接收2000字节 那么就分3次 2000+2000+1000
那么我第一次recv函数按照5000字节来收 返回值收到的是2000 第二次 recv函数按照3000来收 返回值是2000 第三次recv函数按照1000 来收 返回值是1000
然后将3次接收的数据拼接在一起 就是一次收取的数据了。