不明白,为什么在读取socket缓冲的时候出现bad address 错误?发送端write返回值正常,接收端read却返回0,并且打印bad address 错误信息。 接收端代码:receive.c #include <sys/types.h> /**初始化,得到sock_fd**/ int receive_init(int *sock_fd,int port); int main() while (1) sleep(2); return 0; } 发送端代码:send.c #include <sys/types.h> /**初始化send,返回client_fd**/ int main() if(err<0){ } 网上有解释如下:(来源:这里) 在Linux中可以用strerror(errno)去得到错误代码的字符串描述,在涉及到内存操作的时候,一不小心就 strerror(errno)就返回“Bad address”的错误,当然更多的时候是Killed和Segmentation fault。何解呢?绝大多数情况肯定是内存地址已经错误了,我在工作中已经碰到了以下两种“Badaddress”: 第一、文件读写: FILE *fp = NULL; size_t file_length = 0; ……//打开文件并求取文件长度 size_t bytes_read = 0; unsigned char *ptemp = NULL; ……//忘记给ptemp 赋值或者没有给它分配内存。 while (0 == feof(fp)) { byres_read = fread(ptemp, 1, file_length, fp); if (0 != ferror(fp)) { printf(”fread error[%s]\n”, strerror(errno)); …… } ptemp += byres_read; } 这时候返回的错误就是:fread error[Bad address] 原因:ptemp 为空(NULL) 问题: 1. 我如果在ptemp += byres_read;后再加一句file_length -=byres_read;程序会陷入死循环,请兄弟参照微软的 MSDN有关fread的文档查找原因。 第二,recv,send,sendto,recvfrom 有时候调用上述四个函数进行数据收发时也容易发生 “Bad address”的错误,那99%的可能是你函数中有一指针指向无法存取的内存空间。小心哦,兄弟!我们在实际工作中已经碰到过了。 recvfrom可能的错误代码: 1. EBADF 参数s非合法的socket处理代码 附注: 注:果然是没有为指针分配空间的原因。把char *buff 改为char 数组即可,char buff[MAX_SIZE],或者干脆memset (buff,0,MAX_SIZE)。之所以出现 bad address 是因为,指针指向了无法访问的空间。 (ets2008) |