【发布时间】:2013-02-17 16:52:19
【问题描述】:
我正在向自己介绍 C/C++ 中的套接字编程,并使用 send() 和 recv() 通过 TCP 套接字在客户端和服务器程序之间交换数据。
以下是我的代码的一些相关摘录:
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) for send() 是否不限制发送的字节数?
【问题讨论】:
-
与您的问题无关,但您拼写错误。现在改正比以后改好。 :-)
-
@JamesMcLaughlin 很好,先生!
-
缓冲区溢出总是程序中的一个错误,但它们只是有时会导致段错误,这取决于 libc 如何在幕后布置内存。正如您所观察到的,也可能存在损坏的数据,或者一切似乎都可以正常工作。这就是为什么缓冲区溢出如此难以追踪的原因。
标签: c++ c sockets buffer-overflow recv