全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1604
推到 Plurk!
推到 Facebook!

VC++ UDP傳檔..

尚未結案
terry90024
一般會員


發表:1
回覆:1
積分:0
註冊:2008-05-18

發送簡訊給我
#1 引用回覆 回覆 發表時間:2011-05-11 01:26:30 IP:114.36.xxx.xxx 訂閱
 不好意思,請教一下
以下是我的CLIENT 和 SERVER,但是目前只能傳送文字上的訊息
如果想要傳送檔案的話,應該要怎麼做才可以達成呢?
我看書上都只有寫,對這個檔案做讀寫,不知道怎樣才可以達到傳送檔案的功能,希望前輩們能教導一下,謝謝幫忙

client
[code cpp]
#include 
#include 
#include 
#include 
using namespace std;    #define PORT 8888
int main()
{
        WSADATA wsaData;
    int Ret = WSAStartup(MAKEWORD(2,2),&wsaData);
        printf("Client........!\n");
    if(Ret != 0)
    {
                printf("winsock.\n");
                WSACleanup();
    }
    else{
                
        //        printf("winsock\n");
        }
    
    std::string strIP;
        std::cout << "輸入IP: " << std::flush;
    std::cin >> strIP;
    
        SOCKET socketc=::socket(AF_INET,SOCK_DGRAM,IPPROTO_IP);
        sockaddr_in addr;
        addr.sin_addr.S_un.S_addr = inet_addr(strIP.c_str());
        //addr.sin_addr.S_un.S_addr=inet_addr(IP);
        
        addr.sin_family=AF_INET;
        addr.sin_port=ntohs(PORT);
        
        if(socketc==INVALID_SOCKET)
        {
                printf("socket Error!");
        }            int len=sizeof(sockaddr);
                    while (1)//client
        {
                char buf[200]="\0";
                char rbuf[300]="\0";
            printf("\n:");
                scanf("%s",&buf);
                sendto(socketc,buf,strlen(buf) 1,0,(SOCKADDR*)&addr,len);//.....
        
                recvfrom(socketc,rbuf,sizeof(rbuf),0,(SOCKADDR*)&addr,&len);
                if(strcmp(rbuf,"exit")==0)
                {
                        break;
                }
                printf("%s",rbuf);
                
        }
        
        closesocket(socketc);
        WSACleanup();
        printf("end\n");
        return 0;
}    
[/code]

server

[code cpp]
#include  
#include 
#include 
using namespace std;    #define PORT 8888
int main() //server
{
        WSADATA wsaData;    int Ret = WSAStartup(MAKEWORD(2,2),&wsaData);
        printf("Server.........!\n");    if(Ret != 0)    {
                printf("winsock.\n");
                WSACleanup();    }    else{
                
        //        printf("winsock\n");
        }
        
        if ( LOBYTE( wsaData.wVersion ) != 2 ||        HIBYTE( wsaData.wVersion ) != 2 )
        {
                WSACleanup( );
                return 1; 
        }            SOCKET socket=::socket(AF_INET,SOCK_DGRAM,IPPROTO_IP);
        sockaddr_in addr;
        addr.sin_addr.S_un.S_addr=INADDR_ANY;
        addr.sin_family=AF_INET;
        addr.sin_port=ntohs(PORT);
        
        
        
        if(socket==INVALID_SOCKET)
        {
                printf("socket Error!");
        }
        int rs=        bind(socket,(sockaddr*)&addr,sizeof(addr));
        
        if (rs!=0)
        {
                printf("bind failed!");
                return 1;
        }
        char buf[200]="\0";
        char temp[200]="\0";
        sockaddr_in addrcl;
        int len=sizeof(sockaddr);
        
        while(1){
                
                recvfrom(socket,buf,sizeof(buf),0,(sockaddr*)&addrcl,&len);
                
                sprintf(temp,"%s:%s",inet_ntoa(addrcl.sin_addr),buf);        sendto(socket,temp,strlen(temp) 1,0,(sockaddr*)&addrcl,sizeof(addr));
                if(strcmp(buf,"srvexit")==0)
                {
                        break;
                }
                printf("%s",buf);
                printf("\n");
        }
        closesocket(socket);
        
        WSACleanup();
        printf("exit\n");
        return 0;
}
[/code]
編輯記錄
terry90024 重新編輯於 2011-05-10 11:27:12, 註解 無‧
rick060
高階會員


發表:2
回覆:112
積分:217
註冊:2009-11-17

發送簡訊給我
#2 引用回覆 回覆 發表時間:2011-05-11 11:36:11 IP:60.250.xxx.xxx 未訂閱

FILE *fd = NULL;
BYTE *pBuffer = NULL;
char szFile[1024 1];
char szPath[1024 1];
struct stat stBuffer;
memset(szFile,'\0',sizeof(szFile));
memset(szPath,'\0',sizeof(szPath));
memset(&stBuffer,'\0',sizeof(stBuffer));
if( GetModuleFileName(NULL,szPath,sizeof(szPath)) == 0 ) {
perror("GetModuleFileName error");
goto EXIT;
}
*(strrchr(szPath,'\\')) = '\0'; //取得路徑
sprintf(szFile,"%s\\cc.xml",szPath); //組合檔案絕對路徑
if( stat(szFile,&stBuffer) != 0 ) {
perror("stat error");
goto EXIT;
}
if ( (fd = fopen(szFile,"r")) == NULL ) {
perror("fopen error");
goto EXIT;
}
pBuffer = (BYTE*)malloc(stBuffer.st_size);
fread(pBuffer,1,stBuffer.st_size,fd); //取得檔案Byte
EXIT:
if(pBuffer)
free(pBuffer);
if(fd)
fclose(fd);
system("pause");
return 0;


如果你真的看得懂,那就一定會應用。


編輯記錄
rick060 重新編輯於 2011-05-10 21:37:03, 註解 無‧
terry90024
一般會員


發表:1
回覆:1
積分:0
註冊:2008-05-18

發送簡訊給我
#3 引用回覆 回覆 發表時間:2011-05-11 16:13:47 IP:140.136.xxx.xxx 訂閱
 不太清楚細節..只知道大概而已...
可能還要花更多的時間看一下...
aftcast
站務副站長


發表:81
回覆:1482
積分:1762
註冊:2002-11-21

發送簡訊給我
#4 引用回覆 回覆 發表時間:2011-05-12 00:44:35 IP:122.126.xxx.xxx 訂閱
我稍補充一下上樓的意思好了 

1/ 你會送文字訊息,那傳檔和文字有啥不同? 事實上沒什麼不同,以電腦的觀點來說,文字與二進位檔,都是一種數值。簡單講就是傳文字的方法,與傳檔是一樣的。差的只在buffer裡放的東西。
2/ 所以樓上的在指引你,如何去讀檔案到buffer,好讓你把讀出來的buffer用sendto等方法送出,一切就幾乎搞定!
3/ 唯一下注意的一個小地方只有 : 當你把整個檔案的buffer全送完後,你要自己送一個自定的協定,告知收的人,讓他知道檔案已完全送完了! 不用再等了… (假設這個檔很大)

以上,若這3點說明你還是不太了解…那… 暫時也很難再說更清楚。除非有善心人事幫你把一切都寫出來給你用…

good luck


===================引 用 terry90024 文 章===================
不太清楚細節..只知道大概而已...
可能還要花更多的時間看一下...
------



蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
編輯記錄
aftcast 重新編輯於 2011-05-11 10:48:47, 註解 無‧
系統時間:2017-10-23 22:54:10
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!