下載器,就是一種網絡工具,從網絡中接收自己想要的數據。
下載器是一個網絡客戶端。它的下載流程無非就是客戶端連接服務器端,然後
發送資源下載請求,服務器就開始傳送數據回來,客戶端接收數據。
一個簡單的下載就這樣完成了。
所有的網絡應用程序都是從socket編程開始的。下載器同樣就由最簡單的
socket編程開始。
首先是兩個程序,分別是socket的客戶端和服務端。在windows系統vc6.0編譯)
服務器端:
#include <Winsock2.h>
#include <stdio.h>
#pragma comment(lib,"WS2_32.lib")
void main()
{
WSADATA wsd;
SOCKET server; //服務器socket
SOCKADDR_IN addrSrv;
char sendBuf[100];
char recvBuf[100];
SOCKADDR_IN addrClient;
SOCKET client; //連接的客戶端socket
int len;
if(WSAStartup(MAKEWORD(2,2),&wsd)!=0)
{
printf("start up failed!\n");
return ;
}
server=socket(AF_INET,SOCK_STREAM,0); //創建socket
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY); //設置地址
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000); //設置端口號
bind(server,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR)); //綁定
listen(server,5); //設置最多連接數
len=sizeof(SOCKADDR);
while(1)
{
client=accept(server,(SOCKADDR*)&addrClient,&len); //接收客戶端連接
sprintf(sendBuf,"Welcome %s ",
inet_ntoa(addrClient.sin_addr));
send(client,sendBuf,strlen(sendBuf)+1,0); //發送信息客戶端
recv(client,recvBuf,100,0); //接收客戶端數據
printf("%s\n",recvBuf);
closesocket(client);
}
closesocket(client); //關閉連接
WSACleanup();
}
客戶端:
#include <winsock2.h>
#include <stdio.h>
#pragma comment(lib,"WS2_32.lib")
void main()
{
WSADATA wsd;
SOCKET sockClient; //客戶端socket
SOCKADDR_IN addrSrv;
char recvBuf[100];
if(WSAStartup(MAKEWORD(2,2),&wsd)!=0)
{
printf("start up failed!\n");
return ;
}
sockClient=socket(AF_INET,SOCK_STREAM,0); //創建socket
addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);
connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR)); //連接服務器端
recv(sockClient,recvBuf,100,0); //接收服務器端數據
printf("%s\n",recvBuf);
send(sockClient,"hello world",strlen("hello world")+1,0); //向服務器端發送數據
closesocket(sockClient); //關閉連接
WSACleanup();
}
由兩個程序大概的知道了socket編程的流程,也明白網絡的東西終究就是send和recv。
以上兩個程序只需要簡單的改寫,就可以實現簡單的傳送文件了。
將客戶端發送的信息改為發送請求的文件名。
send(sockClient,filename,strlen(filename)+1,0);
服務器端接收到文件名:
recv(client,filename,100,0);
服務器端發送文件信息:
if((fp=fopen(filename,"rb"))==NULL)closesocket(client); //請求的文件不存在,則關閉連接
n=fread(sendBuf,1,100,fp);
while(n>0){
send(client,sendBuf,n,0); //發送文件客戶端
n=fread(sendBuf,1,100,fp);
}
客戶端則接收文件信息:
if((fp=fopen(filename,"wb"))==NULL)
{
return ;
}
while((ret=recv(sockClient,recvBuf,100,0))>0)
{
fwrite(recvBuf,1,ret,fp);
}
這樣就可以在windows下用兩個程序進行文件拷貝。
本文出自 “天天C” 博客,請務必保留此出處http://kenshinf.blog.51cto.com/1088256/281910