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. }  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值