程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 自己動手寫下載器--簡單socket編程

自己動手寫下載器--簡單socket編程

編輯:關於C語言

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

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


所有的網絡應用程序都是從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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved