[英]How can I read an arbitrarily large file to a TCP Socket in C?
我只是在學習套接字編程,我試圖編寫一個從stdin讀取並寫入套接字的echo客戶,然后從套接字讀取對stdout的服務器響應。 問題是我不知道stdin將持續多長時間或服務器響應將持續多長時間。 我嘗試使用的代碼如下(創建套接字並連接到服務器被忽略):
length = BUF_SIZE;
while (length == BUF_SIZE) { // length will equal BUF_SIZE if buf is full, when length < BUF_SIZE we have reached an EOF
// Reads from STDIN to buf
if ((length = read(STDIN_FILENO, buf, BUF_SIZE)) < 0){
fprintf(stderr, "Error in reading from STDIN");
return 4;
}
// Writes from buf to the socket
if ((write(sock, buf, BUF_SIZE)) < 0){
fprintf(stderr, "Error writing to socket");
return 5;
}
}
if ((status = shutdown(sock, 1)) < 0){ // Shuts down socket from doing more receives
fprintf(stderr, "Error shutting down socket for writing");
return 6;
}
length = BUF_SIZE;
while (length == BUF_SIZE){
// Read from socket to buf
if ((length = read(sock, buf, BUF_SIZE)) < 0){
fprintf(stderr, "Error reading from socket");
return 7;
}
// Write from buf to STDOUT
if ((write(STDOUT_FILENO, buf, BUF_SIZE)) < 0){
fprintf(stderr, "Error writing to STDOUT");
return 8;
}
}
close(sock);
exit(0);
BUF_SIZE定義為100。當我運行程序時,程序通常連接到服務器並發送正確的消息,但是它寫到stdout的內容卻什么也不是。
我究竟做錯了什么?
您的while循環只會在第一次使用時起作用。 read()/ write()將僅返回其實際讀取/寫入的數量,該數量可能不等於BUF_SIZE。 假設您從套接字讀取了十個字節,然后向stdout寫入了一百個字節-最后90個將是垃圾。
這些思路可以使您更接近自己想要的東西。
while (1)
{
if ((length = read(STDIN_FILENO, buf, BUF_SIZE)) < 0)
{
fprintf(stderr, "Error in reading from STDIN");
return 4;
}
if ((write(sock, buf, length)) < 0)
{
fprintf(stderr, "Error writing to socket");
return 5;
}
if ((length = read(sock, buf, BUF_SIZE)) < 0)
{
fprintf(stderr, "Error reading from socket");
return 7;
}
if ((write(STDOUT_FILENO, buf, length)) < 0)
{
fprintf(stderr, "Error writing to STDOUT");
return 8;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.