如何使用C套接字编程下载文件
我如何制作像互联网下载管理器的程序从互联网下载给定链接的文件。 可以使用套接字编程C从Internet下载文件。
我们将不胜感激。 谢谢。
- 使用
socket()
创建套接字 - 在上面调用
connect()
。 - 使用
send()
或write()
正确发送GET /path/filename HTTP/1.0\r\n\r\n
请求。 - 正确使用
recv()
或read()
接收响应。 - 解析响应以查明请求是否成功以及文件数据的格式是什么格式。
- 使用
recv()
或read()
接收文件数据(如果存在read()
。 - 使用
close()
关闭套接字。
进一步阅读:
#include #include #include #include // www.axmag.com/download/pdfurl-guide.pdf int main(int argc , char *argv[]) { int socket_desc; char *message; char server_reply[10000]; char *filename = "file.pdf"; int total_len = 0; int file_len = 99352; int len; FILE *file = NULL; struct sockaddr_in server; //Create socket socket_desc = socket(AF_INET , SOCK_STREAM , 0); if (socket_desc == -1) { printf("Could not create socket"); } server.sin_addr.s_addr = inet_addr("198.11.181.184"); server.sin_family = AF_INET; server.sin_port = htons( 80 ); //Connect to remote server if (connect(socket_desc , (struct sockaddr *)&server , sizeof(server)) < 0) { puts("connect error"); return 1; } puts("Connected\n"); //Send request message = "GET /download/pdfurl-guide.pdf HTTP/1.1\r\nHost: www.axmag.com\r\n\r\n Connection: keep-alive\r\n\r\n Keep-Alive: 300\r\n"; if( send(socket_desc , message , strlen(message) , 0) < 0) { puts("Send failed"); return 1; } puts("Data Send\n"); remove(filename); file = fopen(filename, "ab"); if(file == NULL){ printf("File could not opened"); } while(1) { int received_len = recv(socket_desc, server_reply , sizeof server_reply , 0); if( received_len < 0 ){ puts("recv failed"); break; } total_len += received_len; //puts(server_reply); fwrite(server_reply , received_len , 1, file); printf("\nReceived byte size = %d\nTotal lenght = %d", received_len, total_len); if( total_len >= file_len ){ break; } } puts("Reply received\n"); fclose(file); return 0; }