- 论坛徽章:
- 0
|
是一个网络程序,其中一个数据接收的函数有问题,实在找不到问题出在什么地方了
参数char *buf,是在调用函数中定义的一个char buf[255],也试过用 char *buf;buf = (char*)malloc(255);还是出一样的问题
也试过在函数里面定义一个局部变量char cbuf[255],结果还是有问题...
- int net_recv(int fd, char *buf, int len)
- {
- int ret;
- fd_set rfds;
- struct timeval tv;
- FD_ZERO(&rfds);
- FD_SET(fd, &rfds);
- tv.tv_sec = 0;
- tv.tv_usec = 100000;
- /*
- if (rmnet_check(fd) < 0)
- {
- return -1;
- }
- */
- ret = select(fd+1, &rfds, NULL, NULL, &tv);
- if (ret == -1)
- return -1;
- if (ret > 0 && FD_ISSET(fd, &rfds))
- {
- ret = recv(fd, buf, len, MSG_DONTWAIT);
- if (ret < 0)
- {
- return -1;
- }
- return ret;
- }
- return 0;
- }
- int net_recvcmd(int fd, char *buf, int len)
- {
- int ret;
- int i, j;
- int slen;
- int recvlen;
- ushort rcrc;
- ushort ccrc;
- time_t t;
- char *poff;
- slen = 0;
- recvlen = 3;
- time(&t);
- while (time() - t < RecvCmdTimeout)//判断是否超时
- {
- usleep(1000);
- ret = rmnet_recv(fd, buf+slen, recvlen);//recvlen默认为3,主要是因为传送格式为<>crc16,为了保证不读超出,所以每次只读3个字节
- if (ret < 0)
- return -1;
- if (ret > 0)
- {
- slen += ret;
- buf[slen] = 0;
- printf("slen: %d, buf addr: 0x%lx, buf: %s\n", slen, buf, buf);
- /* //这一段代码因为现在出现的错误,所以暂时注释掉,这段代码主要作用是把开始符'<'之前的数据丢弃掉
- if (buf[0] != '<')
- {
- poff = strchr(buf, '<');
- if (poff == NULL)
- {
- slen = 0;
- continue;
- }
- else
- {
- strcpy(buf, poff);
- slen = strlen(buf);
- }
- }*/
- //判断是否读到结束符'>',如果未读到则继续读,如果已读到则判断是否已读完>和最后的2个字节crc
- poff = strchr(buf, '>');
- if (poff == NULL)
- continue;
- if (slen >= poff - buf + 3)
- {
- slen = poff - buf + 3;
- buf[slen] = 0;
- memcpy(&rcrc, buf+slen-2, 2);
- ccrc = GetCrc16(buf, slen-2);
- if (rcrc != ccrc)
- return -1;
- slen -= 2;
- buf[slen] = 0;
- printf("buf: %s\n");
- return slen;
- }
- else
- {
- recvlen = (poff-buf+3) - slen;//当已经读到'>'了以后,只读出后面的2个字节验证码,不希望读超出
- }
- }
- }
- return 0;
- }
- 执行结果是这样的:
- slen: 3, buf addr: 0xb7fba1c0, buf: <12
- slen: 6, buf addr: 0xb7fba1c0, buf: 3 s345
- slen: 9, buf addr: 0xb7fba1c0, buf: 3 sF45abc
- slen: 12, buf addr: 0xb7fba1c0, buf: 3 sF45abcde>
- slen: 14, buf addr: 0xb7fba1c0, buf: 3 sF45abcde>z▒
复制代码
发送的字符串是<12345abcde>,最后面加了两个字节的crc,前面几位老是会被破坏,后面的没有问题
[ 本帖最后由 chenjn 于 2007-6-15 22:23 编辑 ] |
|