簡體   English   中英

通過UDP進行文本基本文件傳輸

[英]Text basic file transfer via UDP

我正在嘗試通過UDP發送文件,可能會用64> 1024字節發送,這是我遇到的問題,是無法發送服務器看到的所有部分:代碼服務器:

void* sender(void* p){
    pthread_mutex_lock(&mtx);

    struct sockaddr_in addr;
    char tString[256];
    int state,
    sock = *(int *)p;
    socklen_t slen = sizeof(tempAddr);
    addr = tempAddr;
    memset(&tempAddr, 0x00, sizeof(tempAddr));

    pthread_mutex_unlock(&mtx);
    FILE* fd = fopen("foo.txt", "r");
    int offset = 0;

    while( fread(tString,1,256, fd) > 0){
        if( (ferror(fd)))
            ERR("!! ?? ferror"); 

        fwrite(tString, 1, 256, stdout);
        if (sendto(sock, tString, strlen(tString), 0, (struct sockaddr *) &addr, slen) < 0){
            ERR("!! ?? sendto");
        }

        if (feof(fd)){
           printf("~ EOF! ~\n");
           break;
        }
        memset(tString,0,256);
    }

    fclose(fd);
    pthread_exit(NULL);
}

輸出示例:

Received pack from 127.0.0.1:55523
Data: asd

server received datagram from localhost (127.0.0.1)
server received 3/256 bytes: asd
Old unsatiable our now but considered travelling impression. In excuse hardly summer in basket misery. By rent an part need. At wrong of of water those linen. Needed oppose seemed how all. Very mrs shed shew gave you. Oh shutters do removing reserved wandered an. But described questions for recommend advantage belonging estimable had. Pianoforte reasonable as so am inhabiting. Chatty design remark and his abroad figure but its.Affronting discretion as do is announcing. Now months esteem oppose nearer enable too six. She numerous unlocked you perceive speedily. Affixed offence spirits or ye of offices between. Real on shot it were four an as. Absolute bachelor rendered six nay you juvenile. Vanity entire an chatty to. ~ EOF! 

客戶:

 FILE* fd = fopen("fooo.txt","w");
    int offset = 0;
    do{
        if (recvfrom(sockfd, tempString, 256, 0, (struct sockaddr*)&sAddr, &slen) < 0){
            ERR("!! ?? recvfrom()");
        }
        fwrite(tempString, 1, 256, fd);
        printf("Received packet from %s:%d\nData: %s\n\n", inet_ntoa(sAddr.sin_addr), ntohs(sAddr.sin_port), tempString);
    }while(fread(tempString,1,256, fd) > 0);

輸出:

Enter data to send(Type exit and press enter to exit) : asd
Received packet from 127.0.0.1:1234
Data: Old unsatiable our now but considered travelling impression. In excuse hardly summer in basket misery. By rent an part need. At wrong of of water those linen. Needed oppose seemed how all. Very mrs shed shew gave you. Oh shutters do removing reserved wande

如您所見,僅發送文本的第一部分。 有什么想法嗎? 附言:EOF被認可,但是我的客戶以某種方式只得到了一部分文本...

編輯:我很確定問題是圍繞此行: }while(fread(tempString,1,256, fd) > 0)在客戶端中...

在客戶端中打開文件時:

FILE* fd = fopen("fooo.txt","w");

該文件為空。 然后在其中寫一些東西:

fwrite(tempString, 1, 256, fd);

文件點指向文件結尾。 此時,如果您閱讀了它,您將立即到達EOF。

fread(tempString,1,256, fd)

因此,do {} while循環將並且僅將工作一圈。

如果要在關閉連接時中斷循環,則應檢查recvfrom()的返回值( http://linux.die.net/man/2/recvfrom ):

返回值:這些調用返回接收到的字節數,如果發生錯誤,則返回-1。 當對等方執行有序關閉時,返回值將為0。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM