2012-05-17 75 views
0

我有一個文件pict.bmp,我需要通過LAN發送。有一個服務器開始監聽端口。客戶端建立與服務器的連接後,它會請求服務器提供文件的文件名。服務器然後使用文件名併發送到客戶端。但問題是服務器使用sendfile()系統調用成功發送它,但該文件不出現在客戶端運行的目錄中。有更好的方法要做到這一點,即一些其他系統調用滿足相同purpose.I我這裏複製粘貼發送接收部分:如何在c中一次性發送使用套接字apis的.bmp文件?

服務器:

while(1){ 

        nsd = accept(sd,(struct sockaddr*)&clit,&clen); 

        if(nsd < 0){ 

          eMsg("Accept error"); 

        } 

        rc = recv(nsd, filename, sizeof(filename), 0); 

        if (rc < 0) { 

          eMsg("Receive error"); 

        } 

        printf("Filename : %s\n",filename); 

        filename[strlen(filename) - 1] = '\0'; 

        if (strcmp(filename, "quit") == 0) { 

          fprintf(stderr, "quit command received, shutting down server\n"); 

          break; 
        } 

        fd = open("2bird.bmp", O_RDONLY); 

        printf("fd is %d\n",fd); 

        if (fd < 0) { 

          eMsg("File Open error"); 

        } 

        offset = 0; 

        rc = sendfile (nsd, fd, NULL, 1); 

        if (rc < 0) { 

         eMsg("File Send error"); 

         fprintf(stderr,"Sending failed"); 

       } 

       if (rc != stat_buf.st_size) { 

         eMsg("File Transfer error"); 

       } 

       close(fd); 

       close(nsd); 

客戶端:

bzero((char *) &serv_addr, sizeof(serv_addr)); 
    39 
    40   serv_addr.sin_family = AF_INET; 
    41 
    42   bcopy((char *)server->h_addr, (char *)&serv_addr.sin_addr.s_addr,server->h_length); 
    43 
    44   serv_addr.sin_port = htons(atoi(argv[2])); 
    45 
    46   if (connect(sd,(struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0) { 
    47 
    48     eMsg("Connection error"); 
    49 
    50   } 
    51 
    52   printf("Please enter the filename : "); 
    53 
    54   bzero(buffer,256); 
    55 
    56   fgets(buffer,255,stdin); 
    57 
    58   n = write(sd,buffer,strlen(buffer)); 
    59 
    60   if (n < 0) 
    61 
    62   error("Writing To Socket error"); 
    63 
    64 
    65   close(sd); 
    66 
    67   return 0; 
    68 
    69 } 
    70 
    71 void eMsg(char *M){ 
    72 
    73   perror(M); 
+0

請讓我知道客戶端程序應該怎麼樣? – Phoenix225

+0

如果客戶端部分失敗,那麼請發佈相關部分。如果可以,請嘗試改進格式,縮進在你發佈的內容中都很奇怪。 – Mat

+1

線路號碼變得更糟。代碼在哪裏保存到客戶端的文件? – Mat

回答

1

正如我所看到的,在服務器上你調用的sendfile()從FD(爲bmp文件文件描述符)到NSD(插座)複製數據。因此,您已將文件內容複製到套接字描述符中。但是要在客戶端獲取這些內容,您必須在客戶端從此套接字接收數據。

由於您沒有這樣做,這就是爲什麼您沒有在客戶端獲取文件。

0

插入e。 G。

buffer[strcspn(buffer, "\n")] = '\0'; 
    int fd = open(buffer, O_CREAT|O_WRONLY, 0666); 
    while (n = read(sd, buffer, 256), n > 0) write(fd, buffer, n); 
    close(fd); 

之前(添加錯誤檢查)

close(sd); 

。當然,更高級別的緩衝區大小會更有效率。

相關問題