小众知识

首页 > 正文

在c++中怎样用winsock在两台计算机间传输文件?

我刚开始学习c++的网络编程,想在两台计算机之间传输文件,没有一点头绪,

不知道怎样着手。请问各位怎样将其实现,大家都有些什么样的方法,或者有没

有示例的源程序可以参考一下?万分感谢!  

 zteliubin 发表于:2003-07-22 12:59:15
得分:0 

用WinSock函数!

源程序多了,www.vckbase.com 

 Jupin 发表于:2003-07-22 13:07:56
得分:0 

// server.cpp
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;

void sys_error(const char *str, const int d)
{
    cout << str << ": " << d << endl;
    system("pause");
    exit(0);
}

int main(int argc, char *agrv[])
{
    int     sockfd, connfd; 
    int     length;
    int     x;
    char    buff[3];
    char    key;
    struct  sockaddr_in servaddr;
    
    enum    {CTRL_Z = 26, BACKSPACE = 8, RETURN = 13, F1_0 = 0, F1_1 = 59};
    time_t  ticks;
    WORD wVersionRequested;
    WSADATA wsaData;
  
    wVersionRequested = MAKEWORD(2, 2);
    if (WSAStartup(wVersionRequested, &wsaData) != 0)
        return 1;
        
    if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
        sys_error("socket error", sockfd);
      
    memset(&servaddr, 0, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    servaddr.sin_port = htons(5000);
    
    if (bind(sockfd, (const struct sockaddr*)&servaddr, sizeof(servaddr)) < 0)
        sys_error("bind error", sockfd);
    
    if (listen(sockfd, 5) < 0)
        sys_error("listen error", sockfd);
    
    cout << "正在等待建立连接..." << endl; 
    for (;;)
    { 
        if ((connfd = accept(sockfd, (struct sockaddr*)NULL, NULL)) < 0)
            sys_error("accept error", connfd);
        
        cout << "与客户端成功建立连接,可以开始通信" << endl;
        bool control;
        for (;;)
        { 
            control = true;
            textbackground(BLACK);
            textcolor(CYAN);  
            printf("\n<<  "); 
            for (; control;)
            {
                key = getch();
                buff[0] = key;
                if (buff[0] == F1_0)
                {
                    buff[1] = getch();
                    buff[2] = 0;
                }
                else
                    buff[1] = 0;      
                length = send(connfd, buff, strlen(buff), 0);
                Sleep(10); 
                if (length != strlen(buff))
                    sys_error("send error", length);
                
                switch (key)
                {
                case F1_0:
                    break;
                case BACKSPACE:
                    if (wherex() > 5)
                    { 
                        gotoxy(wherex() - 1, wherey());
                        putch(' ');
                        gotoxy(wherex() - 1, wherey());
                    } 
                    break;
                case RETURN:
                    printf("\n<<  ");
                    break;
                case CTRL_Z:
                    printf("\r");
                    control = false; 
                    break;
                default:
                    putch(key); 
                } 
            }
            
            control = true;
            textbackground(CYAN);
            textcolor(BLACK);  
            printf("\n-->>  "); 
            while (control 
                   && ((length = recv(connfd, buff, sizeof(buff), 0)) > 0))
            { 
                if (length < 0)
                sys_error("recv error", length); 
                switch (buff[0])
                {
                case RETURN: 
                    printf("\n-->>  ");
                    break;
                case BACKSPACE:
                    if (wherex() > 7) 
                    { 
                        gotoxy(wherex() - 1, wherey());
                        textbackground(BLACK);
                        putch(' ');
                        textbackground(CYAN);
                        gotoxy(wherex() - 1, wherey());
                    }
                    break;
                case CTRL_Z:
                    printf("\r"); 
                    control = false; 
                    break;
                default:
                    putch(buff[0]);
                } 
            }  
        } 
        closesocket(connfd);
    }
    WSACleanup();

 sky_blue 发表于:2003-07-22 13:10:31
得分:0 

直接用socket就可以了

 Jupin 发表于:2003-07-22 13:12:30
得分:0 

// client.cpp
#include 
#include 
#include 
#include 
#include 
using namespace std;

void sys_error(const char *str, const int d)
{
    cout << endl << str << ": " << d << endl;
    system("pause");
    exit(0);
}

void show(const char *ip)
{
    cout << "欢迎使用本聊天工具\n    作 者:Awu\n    版    本: V0.01"
            "\n    开发日期:2003/07/21" << endl;  
    cout << "与服务器端[ip = " << ip << "]成功建立连接,可以开始通信" << endl;
    cout << "使用说明:\n    1. 必须是通信双方轮流发言;\n" 
            "    2. 发言结束时按Ctrl + Z,等待对方回应;\n"
            "    3. 按F1将获得帮助。" << endl; 
}

int main(int argc, char *argv[])
{
    int     sockfd;
    int     length;
    char    buff[3];
    char    key;
    struct  sockaddr_in servaddr;
    char    ip[18] = "138.0.0.221"; // 把此IP地址改成你的机器地址,也可以在运行时 // 作为参数输入。
    enum    {CTRL_Z = 26, BACKSPACE = 8, RETURN = 13, F1_0 = 0, F1_1 = 59};
    
    WORD wVersionRequested;
    WSADATA wsaData;
    
    wVersionRequested = MAKEWORD(2, 2);
 
    if (WSAStartup(wVersionRequested, &wsaData) != 0)
        return 1;
        
    if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
        sys_error("socket error", sockfd);
   
    memset(&servaddr, 0, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_port = htons(5000);
    if (argc > 2)
        strcpy(ip, argv[1]); 
    servaddr.sin_addr.s_addr = inet_addr(ip);
    if (connect(sockfd, (const struct sockaddr*)&servaddr, sizeof(servaddr)) < 0)
        sys_error("connect error", sockfd);
    show(ip);
    
    for (;;)
    {
        bool control = true;
        textbackground(CYAN);
        textcolor(BLACK); 
        printf("\n-->>  "); 
        while (control && (length = recv(sockfd, buff, sizeof(buff), 0)) > 0)
        {   
            switch(buff[0])
            {
            case F1_0:
                if (buff[1] == F1_1)
                    show(ip); 
                break;
            case RETURN: 
                printf("\n-->>  ");
                break;
            case BACKSPACE:
                if (wherex() > 7)
                {
                    gotoxy(wherex() - 1, wherey());
                    textbackground(BLACK); 
                    putch(' ');
                    textbackground(CYAN);
                    gotoxy(wherex() - 1, wherey());
                }
                break;
            case CTRL_Z:
                printf("\r");
                control = false;
                break;
            default: 
                putch(buff[0]);
            }
        }
        if (length < 0)
            sys_error("recv error(可能服务器已关闭)", length);
       
        control = true;
        textbackground(BLACK);
        textcolor(CYAN); 
        printf("\n<<  ");
        for (; control;)
        {   
            key = getch();
            buff[0] = key;
            if (buff[0] == 0)
            {
                buff[1] = getch();
                buff[2] = 0;
            }
            else
                buff[1] = 0;
            length = send(sockfd, buff, strlen(buff), 0);
            if (length != strlen(buff))
                sys_error("send error", length);
            Sleep(10);
            
            switch (key)
            {
            case F1_0:
                if (buff[1] == F1_1)
                    show(ip);
                break;
            case BACKSPACE:
                if (wherex() > 5)
                {
                    gotoxy(wherex() - 1, wherey());
                    putch(' ');
                    gotoxy(wherex() - 1, wherey());
                }
                break;
            case RETURN:
                printf("\n<<  ");
                break;
            case CTRL_Z:
                printf("\r");
                control = false;
                break;
            default:
                putch(key);
            }        
        }        
    }
    closesocket(sockfd);
}

socket编程大致如此,若要作文件传送,先把文件读到一个缓冲中,再逐块送。 

上一篇:各位,如何得到类中数据成员的偏移量?
下一篇:请问对于一个包含指针数据成员的类如何重载“+”这样的运算符?谢谢

分享到: