我介紹自己插座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