Linux C——網絡編程傳輸文件的實驗

原先對文件總是有一種莫名的抗拒,原因未知,最近做東西的時候需要用套接字傳送文件、圖片之類的東西,沒辦法,只好硬着頭皮上了。

做了一個小實驗,下面是幾點心得:

(1)網上查了一些資料,發現其實套接字傳送文件和傳輸文字沒什麼區別的,因爲它只負責發送和接收,而對到底是什麼樣類型的數據是並不感冒的(以字節爲單位傳輸)

(2)發送文件時,需要先把文件以二進制格式打開,讀取到內存中,然後再發送;

(3)接收文件時,需要先讀進內存中,然後再以二進制格式寫到文件中;

(4)傳輸時,爲了保證傳輸的可靠性,必須遵循TCP協議;

實驗只是基本實現功能,可能在安全性和準確性方面欠缺,有高手路過的話請指正,不甚感激!

用到的幾個文件操作函數:

(1) fopen()、fclose()  分別是打開和關閉文件;

(2)fread()、fwrite()  分別是讀、寫文件;

(3)feof() 判斷是否到了文件尾;

實驗的主要功能是:客戶端向服務器發送圖片

代碼如下:

客戶端代碼:

[cpp] view plain copy
  1. /*Arthur: Bai YongHui*/  
  2. /*Data: 2011.11.04*/  
  3. /*功能:客戶端,給服務器發送圖片*/  
  4.   
  5. #include <stdio.h>  
  6. #include<iostream.h>  
  7. #include <winsock2.h>  
  8.   
  9. #include "initSock.h"  
  10.   
  11. void main()   
  12. {  
  13.     CinitSock initSock;   
  14.   
  15.     FILE * fp=NULL;  
  16.     if((fp=fopen("1.jpg","rb"))==NULL)  
  17.     {  
  18.         printf("cannot open file\n");  
  19.         return;  
  20.     }  
  21.   
  22.     SOCKET sendSock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );  
  23.     if ( sendSock == INVALID_SOCKET )   
  24.     {  
  25.         printf( "Error at socket(): %ld\n", WSAGetLastError() );  
  26.         return;      
  27.     }  
  28.       
  29.     sockaddr_in srvAddr;  
  30.     srvAddr.sin_family = AF_INET;  
  31.     srvAddr.sin_addr.S_un.S_addr = inet_addr( "127.0.0.1" );  
  32.     srvAddr.sin_port = htons( 2035 );  
  33.   
  34.     if (connect( sendSock, (SOCKADDR*) &srvAddr, sizeof(srvAddr) ) == SOCKET_ERROR)   
  35.     {  
  36.         printf( "Failed to connect.\n" );  
  37.         return;  
  38.     }  
  39.   
  40.     int nSend=0;              
  41.   
  42.     char sendBuf[1024]={0};  
  43.   
  44.     while(1)  
  45.     {  
  46.         int nRead = fread(sendBuf, 1024, 1, fp);  
  47.   
  48.         if(nRead<1 && ferror(fp)!=0)  
  49.         {  
  50.             printf("failed to read file\n");  
  51.             return;  
  52.         }  
  53.   
  54.         nSend = send( sendSock, sendBuf, 1024, 0 );  
  55.   
  56.         if( nSend == SOCKET_ERROR )  
  57.         {  
  58.             printf("the connection to server has been failed\n");  
  59.             return;  
  60.         }  
  61.   
  62.         printf( "success to send %d bytes\n", nSend );  
  63.   
  64.         if(feof(fp))  
  65.         {  
  66.             printf("success to transmit file to server\n");  
  67.             break;  
  68.         }  
  69.     }  
  70.   
  71.     closesocket(sendSock);  
  72.     fclose(fp);  
  73. }  

服務器代碼:

[cpp] view plain copy
  1. /*Arthur: Bai YongHui*/  
  2. /*Data: 2011.11.04*/  
  3. /*功能:服務器,用於接收來自客戶端發送的圖片*/  
  4.   
  5. #include <stdio.h>  
  6. #include<iostream.h>  
  7. #include <winsock2.h>  
  8. #include<string.h>  
  9.   
  10. #include "initSock.h"  
  11.   
  12. void main()   
  13. {  
  14.   
  15.     CinitSock initSock;  
  16.   
  17.   
  18.     SOCKET lstnSock = socket( AF_INET, SOCK_STREAM, 0);  
  19.     if ( lstnSock == INVALID_SOCKET )   
  20.     {  
  21.        printf( "failed to create socket\n" );  
  22.        return;      
  23.     }  
  24.   
  25.   
  26.     sockaddr_in bindAddr;  
  27.     bindAddr.sin_family = AF_INET;  
  28.     bindAddr.sin_addr.S_un.S_addr = inet_addr( "127.0.0.1" );  
  29.     bindAddr.sin_port = htons(2035);  
  30.   
  31.     int addrLen=sizeof(SOCKADDR);  
  32.   
  33.     if ( bind( lstnSock, (SOCKADDR*) &bindAddr, addrLen ) == SOCKET_ERROR )   
  34.     {  
  35.         printf( "failed to bind\n" );  
  36.         closesocket(lstnSock);  
  37.         return;  
  38.     }  
  39.   
  40.     if ( listen( lstnSock, 5 ) == SOCKET_ERROR )  
  41.     {  
  42.       printf( "failed to listen\n");  
  43.       return;  
  44.     }  
  45.   
  46.     SOCKET commSock=INVALID_SOCKET;  
  47.   
  48.   
  49.     commSock =  accept( lstnSock, NULL, NULL );  
  50.     if(commSock != INVALID_SOCKET )  
  51.         printf( "Client connected to Server\n" );  
  52.   
  53.   
  54.     char recvbuf[1024]={0};  
  55.   
  56.     FILE *fp;  
  57.     if((fp=fopen("recv.jpg","wb+"))==NULL)  
  58.     {  
  59.         printf("cannot open file\n");  
  60.         return;  
  61.     }  
  62.   
  63.     while(1)  
  64.     {  
  65.         int nRecv = recv( commSock, recvbuf, 1024, 0 );  
  66.         if( nRecv == SOCKET_ERROR )  
  67.         {  
  68.             printf("connection to client has been failed\n");  
  69.             return;  
  70.         }  
  71.         else if( nRecv == 0 )  
  72.         {  
  73.             printf( "success to receive faile from client\n" );  
  74.             break;  
  75.         }  
  76.   
  77.   
  78.         int nWrite=fwrite(recvbuf,1024,1,fp);  
  79.   
  80.         if( nWrite<1 && ferror(fp)!=0 )  
  81.         {  
  82.             printf( "failed to write file\n" );  
  83.             return;  
  84.         }  
  85.     }  
  86.   
  87.     closesocket(commSock);  
  88.     closesocket(lstnSock);  
  89.     fclose(fp);  
  90. }  
發佈了105 篇原創文章 · 獲贊 48 · 訪問量 21萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章