2013-03-21 270 views
0

這是客戶:UDP客戶端/服務器塊

int main(int argc, char* argv[]){ 
    int port; 
    int nrb; 
    int flag; 
    int file; 
    struct hostent *host; 
    unsigned int len; 
    char fileName[50]; 
    int sock; 
    char* buffer; 
    int bytesRead; 
    char dest[50]; 
    struct sockaddr_in sv_addr; 
    sscanf(argv[1], "%d", &port); 
    sscanf(argv[2], "%d", &nrb); 
    host=gethostbyname("127.0.0.1"); 
    printf("%d%d", port, nrb); 
    buffer= (char*)malloc(nrb*sizeof(char)); 
    sock= socket(AF_INET,SOCK_DGRAM, 0); 

    memset(&sv_addr,0,sizeof(struct sockaddr_in)); 

    sv_addr.sin_family = AF_INET; 
    sv_addr.sin_port = htons(port); 
    sv_addr.sin_addr= *(struct in_addr*)host->h_addr_list[0]; 

    len= sizeof(sv_addr); 

    printf("File name: "); 
    scanf("%s", fileName); 

    sendto(sock, fileName, sizeof(fileName), 0 , (struct sockaddr*)&sv_addr, len); 
    printf("before recvrom"); 
    recvfrom(sock, &flag, sizeof(int), 0, (struct sockaddr*)&sv_addr,&len); 
    flag= htons(flag); 
    printf("recvfrom1: %d", flag); 
    if(flag==-1){ 
     printf("The file does not exist."); 
     exit(0); 
    } 

    strcpy(dest,"./received/"); 
    strcat(dest, fileName); 

    file=open(dest, O_WRONLY| O_CREAT | O_TRUNC, 0755); 

    do{ 
     bytesRead= recvfrom(sock, buffer, nrb, 0, (struct sockaddr*)&sv_addr, &len); 
     write(file, buffer, bytesRead); 
    }while(bytesRead>0); 

    free(buffer); 
    close(file); 
    close(sock); 

    return 0; 
} 

這是sendto電話後堵,所以也沒有「recvfrom的前」打印,但是服務器接收客戶端發送的內容,並做了所有東西。 這是服務器:

int main(int argc, char* argv[]){ 
    int port; 
    unsigned int len; 
    int nrb; 
    char fileName[50]; 
    struct sockaddr_in cl_addr; 

    sscanf(argv[1], "%d", &port); 
    sscanf(argv[2], "%d", &nrb); 

    sock=socket(AF_INET, SOCK_DGRAM, 0); 
    memset(&sock_addr, 0, sizeof(sock_addr));\ 

    sock_addr.sin_family= AF_INET; 
    sock_addr.sin_port= htons(port); 
    sock_addr.sin_addr.s_addr=INADDR_ANY; 

    bind(sock, (struct sockaddr*)&sock_addr, sizeof(sock_addr)); 
    len=sizeof(sock_addr); 
    recvfrom(sock, fileName, 256, 0, (struct sockaddr*)&cl_addr,&len); 
    printf("recieved: %s\n", fileName); 
    int readBytes,file, flag; 
    char* buffer; 
    flag=0; 
    file= open(fileName, O_RDONLY); 
    flag=htonl(file); 
    if(sendto(sock, &flag, sizeof(int), 0, (struct sockaddr*)&cl_addr,len)<0){ 
     perror("sendto"); 
    } 
    if(file== -1){ 
     exit(0); 
    } 

    buffer=(char*)malloc(sizeof(char)*nrb); 
    do{ 
     memset(buffer, 0, nrb); 
     readBytes= read(file, buffer, nrb); 
     printf("%s", buffer); 
     sendto(sock, buffer, nrb,0, (struct sockaddr*)&cl_addr, len); 

    }while(readBytes>0); 
    close(file); 
    free(buffer); 
    return 0; 
} 
+1

你確定printf沒有被執行嗎?標準輸出通常會被緩衝,因此即使執行了printf語句,輸出可能也不會發生。您可以在printf之後添加對fflush的調用,或者使用調試器單步調試代碼,以查看實際發生的情況。 – 2013-03-21 16:30:05

+0

我已經嘗試過使用fflush,現在它會打印該消息。所以我想問題是recvfrom調用。你有什麼想法嗎? – 2013-03-21 16:39:50

+0

請在發佈之前先清理您的代碼(即縮進) – Wug 2013-03-21 16:49:50

回答

2

那是會被髮送256個字節的消息?或更少?雖然recvfrom()「通常」會以較短的消息返回,但不能保證它會。嘗試使用MSG_DONTWAIT並處理獲取0字節和EWOULDBLOCK情況的情況。

+0

客戶端向服務器發送文件名稱,所以消息少於256字節。現在服務器將這些東西發送到客戶端,客戶端接收它,但客戶端試圖接收一些東西。服務器最終發送0字節,所以服務器停止,但客戶端從不接收0字節。 – 2013-03-21 17:25:00

+0

感謝您的幫助,我解決了這個問題。 – 2013-03-21 18:15:45