本身動手寫下載器--簡單socket編程

下載器,就是一種網絡工具,從網絡中接收本身想要的數據。
下載器是一個網絡客戶端。它的下載流程無非就是客戶端鏈接服務器端,而後

發送資源下載請求,服務器就開始傳送數據回來,客戶端接收數據。
一個簡單的下載就這樣完成了。


全部的網絡應用程序都是從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下用兩個程序進行文件拷貝。
相關文章
相關標籤/搜索