我介绍自己插座C/C++编程,并且正在使用send()
和recv()
超过TCP
插座交换客户端和服务器程序之间传输数据。`recv()`是否会导致缓冲区溢出?
下面是我的一些代码相关摘录:
server.c:
char recv_data[1024];
// Socket setup and so on ommited...
bytes_recieved = recv(connected, recv_data, 1024, 0);
recv_data[bytes_recieved] = '\0';
client.c:
char send_data[1024];
// Setup ommited...
send(connected, send_data, strlen(send_data), 0);
是否recv()
本身提供对任何保护缓冲区溢出?举例来说,如果我改变了第三个参数来recv()
比缓冲区的东西更高指向recv_data
(例如4000) - 这会导致缓冲区溢出? (我已经尝试过这样做,但似乎无法触发段错误)。
实际上,我试图创建一个故意漏洞的服务器程序,以便更好地了解这些问题,这就是为什么我已经通过recv()
试图溢出。
修订:
不无关系,会找出为什么client.c
上面会永远派比strlen(send_data)
指定的1024
字节。我使用gets(send_data)
来填充从标准输入该缓冲区,但如果我在通过标准输入多个超过1024字节,server.c
计划表明,它接收所有字节! :)。是否strlen(send_data)
为send()
没有限制发送的字节数量?
与你的问题无关,但你拼写错误。现在更好地纠正它,而不是稍后。 :-) – 2013-03-03 15:51:54
@JamesMcLaughlin好抓,先生! – csjohn 2013-03-03 15:55:38
缓冲区溢出总是程序中的一个错误,但是它们只有时间会导致段错误,这取决于libc如何布置幕后内存。正如你观察到的那样,也可能有损坏的数据,或者一切都可能正常工作。这就是为什么缓冲区溢出难以追查的原因。 – gcbenison 2013-03-03 16:04:04