当前位置: 技术问答>linux和unix
read()函数的一个问题 急!!!!
来源: 互联网 发布时间:2015-07-22
本文导语: 我现在正在看一个网络服务器的服务端(socket编程),中间收数据是这样的: char buff[3]; int lenf=read(cfd,buff,1024);//cfd是已经定义好的套接字 这样对吗?buff定义不是只有三个字节吗?可是接受的最大长度...
我现在正在看一个网络服务器的服务端(socket编程),中间收数据是这样的:
char buff[3];
int lenf=read(cfd,buff,1024);//cfd是已经定义好的套接字
这样对吗?buff定义不是只有三个字节吗?可是接受的最大长度是1024啊
望各位赐教!!
char buff[3];
int lenf=read(cfd,buff,1024);//cfd是已经定义好的套接字
这样对吗?buff定义不是只有三个字节吗?可是接受的最大长度是1024啊
望各位赐教!!
|
这样是有问题的。
|
长度一定要严格定义成3+1,否则超出buffer的范围会有不可预料的后果
|
我可以明确的告诉你,这段程序编译运行可能是没有问题,但是如果系统在分配内存的时候,buff后是分派的一个指针,那里就死定了.c是不对边界进行检查的,所以一定要自己设置好边界,这里可能只是将buff当作char*使用,而不是char buff[3],使用吧.
|
no problem
|
buf[1024];比较好。
|
编译可以通过吗?如果可以通过,就绝对会出现不可预知的错误,因为你犯了一个内存越界的错误.
比如(为内存地址):
buff: 0x00ffcc10
0x00ffcc11
0x00ffcc12
这是buff的内存地址,如果写入1024,将会将0x00ffcc12~0x00ffd011的数据写入到cfd中,可能这段地址被使用,或者没有使用(运气好),或者正在使用(多线程或者多进程),那是你就只有等死了.呵呵.小议.
比如(为内存地址):
buff: 0x00ffcc10
0x00ffcc11
0x00ffcc12
这是buff的内存地址,如果写入1024,将会将0x00ffcc12~0x00ffd011的数据写入到cfd中,可能这段地址被使用,或者没有使用(运气好),或者正在使用(多线程或者多进程),那是你就只有等死了.呵呵.小议.
|
好像是不对,按照搂主的意思,这段代码是不是因为所接收的报文在报文头部用3个字符表示报文长度,所以先读取3个字节,再根据这3个字节的值来读取报文体呢?
|
to LLeexhiling:
什么“明确”,“可能”,“但是”,“如果”,“就死定了”。
不要乱说。
to shuimuyu
>> memcpy(recevicedDatap,buff+1,8);
>> recevicedDatap[8]='';
buff哪来的8个字节
漏洞百出
什么“明确”,“可能”,“但是”,“如果”,“就死定了”。
不要乱说。
to shuimuyu
>> memcpy(recevicedDatap,buff+1,8);
>> recevicedDatap[8]='';
buff哪来的8个字节
漏洞百出