您的位置:首页 > 理论基础 > 计算机网络

C语言通过网络实现发送文件的一点记录

2013-04-01 23:00 591 查看
Code First.

Server.c代码分析。

  

  1.引入一些头文件和dll.

    

#include <winsock2.h>
#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>

#pragma comment(lib, "ws2_32.lib")


  2.服务器建立Socket套接字

  

    

View Code

#include <stdio.h>
#include <winSock2.h>
#include <stdlib.h>
#include <time.h>
#include <sys/stat.h>

#pragma comment(lib, "ws2_32.lib")

/*
函数名:getFileSizeSystemCall(char * strFileName)
功能:获取指定文件的大小
参数:
strFileName (char *):文件名
返回值:
size (int):文件大小
*/
int getFileSizeSystemCall(char * strFileName)
{
struct stat temp;
stat(strFileName, &temp);
return temp.st_size;
}

int getFileSize(char * strFileName){

FILE *fp;
int size;
if ((fp = fopen(strFileName,"rb")) == NULL)
{
printf("File open error\n");
return 0;
}

fseek(fp,0L,SEEK_END);
size = ftell(fp);

fclose(fp);
return size;
}

void RecvFile(SOCKET sock,char *filename);

void main(void)
{
WSADATA              wsaData;
SOCKET               s;
SOCKADDR_IN          ServerAddr;

int                  Port = 5151;

//    char                msg1[128];
//    char                msg2[128];

WSAStartup(MAKEWORD(2,2), &wsaData);

// 创建一个新的Socket来连接服务器

s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

// 填写客户端地址信息
// 端口为5150
// 服务器IP地址为"136.149.3.29",注意使用inet_addr将IP地址转换为网络格式

ServerAddr.sin_family = AF_INET;
ServerAddr.sin_port = htons(Port);
ServerAddr.sin_addr.s_addr = inet_addr("10.160.17.141");//192.168.1.103

// 向服务器发出连接请求

if ( connect(s, (SOCKADDR *) &ServerAddr, sizeof(ServerAddr)) ==
SOCKET_ERROR)
{
printf("Connection Error....\n");
return ;
}

printf("Connectd....\n");

//    recv(s,msg1,sizeof(msg1),0);
//    recv(s,msg2,sizeof(msg2),0);

//    printf("msg = %s\n",msg1);
//    printf("msg = %s\n",msg2);

RecvFile(s,"G:\\test.rmvb");

// 新的连接建立后,就可以互相通信了,在这个简单的例子中,我们直接关闭连接,
// 并关闭监听Socket,然后退出应用程序

closesocket(s);
// 释放Windows Socket DLL的相关资源
WSACleanup();
getchar();
}

void RecvFile(SOCKET sock,char *filename){

FILE *fp;//文件指针
char buf[8192];//缓冲区

int filesize ;
int blocks;
int i;
int res;
int count ;

printf("开始接收文件..\n");

//接收文件大小
recv(sock,(char *)&filesize,sizeof(filesize),0);

printf("接收文件大小: %d\n",filesize);

fp = fopen(filename,"wb+");
if (fp == NULL) {
printf("Client...文件打开错误..\n");
exit(1);
}

//接收数据
blocks = filesize / sizeof(buf) + 1;

printf("块大小: %d\n",blocks);

for (i=0; i<blocks;++i) {

//清空缓冲区
memset(buf,0,sizeof(buf));
//接收数据
res = recv(sock,buf,sizeof(buf),0);
//写入数据
count = fwrite(buf,sizeof(buf),1,fp);

printf("第 %d 次是否写入: %d\n",i+1,count);
printf("第 %d 次接收: %d\n", i+1,res);
}

//关闭文件
fclose(fp);
}


  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: