网络文件传输c
代码如下(此程序用于WINDOWS,我用的是VC调试的,LINUX下方法略有不同)文件接收端:#pragma comment(lib,"ws2_32.lib")#include <stdio.h>
#include <io.h>
#include <winsock2.h>
#include <fcntl.h>
#include <sys\stat.h>
int recv_file(SOCKET sock)
{
char buffer[1024] = {0};
int name_len;
/*首先读取sizeof(int) 即4个字节的内容,服务器发送文件名之前会把该文件名的长度发送过来*/
if (recv(sock,(char *)&name_len,sizeof(int),0) < 0)
{
printf("远程服务器断开");
return -1;
}
/*接收即将传输文件的文件名*/
if (recv(sock,buffer,name_len,0))
{
printf("远程服务器断开");
return -1;
}
/*创建该文件,最好此处加上判断,该文件是否已经存在*/
int fd = open(buffer,O_RDWR|O_CREAT ,S_IFMT );
if (fd < 0)
{
printf("文件创建失败\n");
return -1;
}
int recv_count = 0;
/*从套接字循环读取文件内容*/
while ((recv_count = recv(sock,buffer,sizeof(1024),0))>0)
{
/*将读取到的内容保存至文件,recv_count为从网络上读取到得字节数,然后原数保存至文件*/
write(fd,buffer,recv_count);
}
printf("文件接收完成,成功保存至当前目录下\n");
return 0;
}
void main()
{
WSADATA wsa_data;
/*windows 下使用sock 必须调用这个函数,0x0202是一个版本号*/
WSAStartup(0x0202,&wsa_data); SOCKET s_sock;
/*创建套接字*/
s_sock = socket(AF_INET,SOCK_STREAM,0); /*定义本机绑定套接字需要的IPV4地址*/
sockaddr_in se_addr;
se_addr.sin_family = AF_INET;
se_addr.sin_port = htons(1024);/*指定端口号1024*/
se_addr.sin_addr.S_un.S_addr = INADDR_ANY;/*绑定本机任意网卡IP*/ /*将前两步创建的套接字和IP地址绑定*/
bind(s_sock,(sockaddr*)&se_addr,sizeof(sockaddr)); /*开始启动监听服务*/
if (listen(s_sock,10)<0)
{
int err = GetLastError();
}
sockaddr_in from_addr;
int addr_len = sizeof(from_addr);
/*等待发送文件服务器连接,此为阻塞函数*/
SOCKET temp_sock = accept(s_sock,(sockaddr *)&from_addr,&addr_len); /*有服务器连接到本机,调用接收文件函数*/
recv_file(temp_sock);
} 文件发送端:#pragma comment(lib,"ws2_32.lib")#include <stdio.h>
#include <io.h>
#include <winsock2.h>
#include <fcntl.h>
#include <sys\stat.h>
int send_file(SOCKET sock,char *name)
{
int fd = open(name,O_RDWR ,S_IFMT );
if (fd < 0)
{
printf("文件打开失败\n");
return -1;
} int name_len = strlen(name);
/*首先发送文件名的长度*/
send(sock,(char *)&name_len,sizeof(int),0);
/*发送文件名*/
send(sock,name,name_len,0);
char buffer[1024] = {0};
int read_count = 0;
/*循环从文件中读取,然后写入到套接字,发送到网络*/
while ((read_count = read(fd,buffer,sizeof(1024)))>0)
{
send(sock,buffer,read_count,0);
}
printf("文件发送完成\n");
return 0;
}
void main(int argc,char *argv[])
{
WSADATA wsa_data;
WSAStartup(0x0202,&wsa_data);
SOCKET s_sock;
s_sock = socket(AF_INET,SOCK_STREAM,0);
sockaddr_in to_addr;
to_addr.sin_family = AF_INET;
to_addr.sin_port = htons(1024);
/*指定接收文件IP为本机(127.0.0.1为本机IP),如其他主机请更改此IP,正常来说,IP应写入配置文件*/
to_addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
char file_name[256] = {0};
printf("请输入要发送的文件名,并确保该文件存在于当前目录下\n");
scanf("%s",file_name); /*连接接收文件的电脑*/
if (connect(s_sock,(sockaddr *)&to_addr,sizeof(sockaddr)) < 0)
{
printf("链接接受文件电脑失败\n");
return;
} /*调用发送文件函数*/
send_file(s_sock,file_name);
}
Ⅱ C语言编写TCP的文件传输
粗略看了一下,你是用户的是TCP不是UDP,注意一点TCP可靠安全但是需要你自己手动处理粘包问题.你要是想学网络编程,就需要学会分析和定制协议.我建议你先去看看TFTP的网络协议.所谓的通信就是我发请求给你,你给我应答(请求成功还是失败).你刚学网络编程,直接是使用tcp不是很合适,你可以去看看TFTP的协议(向服务器请求下载或者上传文件).复杂一点的程序一搬都需要定制网络协议,tcp则还需要处理粘包问题.如果你想学,可以和我联系,我可以发你资料→_→
Ⅲ C语言socket编程实现网络数据传输
仅供参考
// serverTCP.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
using namespace std;
long long cnt = 0;
void transFile(SOCKET s)
{
printf("新子服务%d......",cnt);
send(s,"welcome to TCP FILE SERVER !",strlen("welcome to TCP FILE SERVER !")+1,0);
char Buf[BUFSIZE];
FILE *fp;
//printf("客户端已打开\n请输入存放文件地址:\n");
char FilePath[128]={"0"};
ltoa(cnt,FilePath,10);
if((fp=fopen(FilePath,"wb"))==NULL)
{
printf("文件未打开\n");
return;
}
else
{
send(s,"开始传送",strlen("开始传送")+1,0);
//得到文件大小
char Size[20];
long int FileSize=0;
recv(s,Size,21,0);
FileSize=atol(Size);
printf("得到文件大小: %d\n",FileSize);
//开始传送
char Block[BUFSIZE];
long int x=0;
while (1)
{
x += BUFSIZE;
if(x < FileSize)
{
recv(s,Block,BUFSIZE+1,0);
fwrite(Block,1,BUFSIZE,fp);
}
else
{
recv(s,Block,FileSize+BUFSIZE-x+1,0);
printf("文件接收完毕\n");
fwrite(Block,1,FileSize+BUFSIZE-x,fp);
fclose(fp);
break;
}
}
}
fclose(fp);
closesocket(s);
}
int _tmain(int argc, _TCHAR* argv[])
{
WORD myVersionRequest;
WSADATA wsaData;
myVersionRequest=MAKEWORD(1,1);
int err;
err = WSAStartup(myVersionRequest,&wsaData);
if (!err)
{
printf("服务器启动......\n");
}
else
{
printf("服务器启动失败!");
exit(0);
}
SOCKET serSocket = socket(AF_INET,SOCK_STREAM,0);//创建了可识别套接字
SOCKADDR_IN addr;
addr.sin_family=AF_INET;
addr.sin_addr.S_un.S_addr=htonl(INADDR_ANY);//ip地址
addr.sin_port=htons(PORTBASE);//绑定端口
bind(serSocket,(SOCKADDR*)&addr,sizeof(SOCKADDR));//绑定完成
listen(serSocket,ACESIZE);//其中第二个参数代表能够接收的最多的连接数
SOCKADDR_IN clientAddr;
int len = sizeof(SOCKADDR);
while(1)
{
cnt++;
SOCKET serConn;
serConn = accept(serSocket,(SOCKADDR*)&clientAddr,&len);//如果这里不是accept而是conection的话。。就会不断的监听
if(_beginthread((void (*)(void *))transFile, ACESIZE,(void *)serConn) < 0) return 0;
}
return 0;
}
// clientTCP.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
WORD myVersionRequest;
WSADATA wsaData;
myVersionRequest=MAKEWORD(1,1);
int err;
err=WSAStartup(myVersionRequest,&wsaData);
if (!err)
{
printf("已打开套接字\n");
}
else
{
//进一步绑定套接字
printf("套接字未打开!");
return 0;
}
SOCKET cliSocket =socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addr;
char ip_addr[16]={"127.0.0.1"};
addr.sin_addr.S_un.S_addr=inet_addr(ip_addr);
addr.sin_family=AF_INET;
addr.sin_port=htons(PORT);
char ACK[64];
connect(cliSocket,(SOCKADDR*)&addr,sizeof(SOCKADDR));//开始连接
recv(cliSocket,ACK,sizeof(ACK),0);
printf("%s\n",ACK);
FILE *fp;
int FileSize=0;
char Block[BUFSIZE]={"0"};
char FilePath[128]={"0"};
int i=0;
do
{
printf("请输入文件地址:\n");
gets(FilePath);
i = 0;
if((fp=fopen(FilePath,"rb"))==NULL)
{
i = 1;
printf("文件打开失败\n");
}
}while(i);
fseek(fp,0L,SEEK_END);
FileSize=ftell(fp);
printf("待传送文件大小: %d\n",FileSize);
printf("等待服务器接受......\n");
recv(cliSocket,Block,sizeof(Block),0);
printf("%s\n",Block);
if(strcmp(Block,"开始传送")==0)
{
char Size[20];
ltoa(FileSize,Size,10);
send(cliSocket,Size,sizeof(Size),0);
fseek(fp,0L,SEEK_SET);
long int y=0;
char trans[BUFSIZE];
while(!feof(fp))
{
fread(trans,1,BUFSIZE,fp);
y=y+BUFSIZE;
if(y<FileSize)
{
send(cliSocket,trans,BUFSIZE+1,0);
}
else
{
send(cliSocket,trans,FileSize+BUFSIZE-y+1,0);
closesocket(cliSocket);
WSACleanup();
}
}
}
printf("文件发送完毕\n");
fclose(fp);
closesocket(cliSocket);
WSACleanup();
system("pause");
return 0;
}
Ⅳ 怎么使用局域网互传文件
工具复/原料
两台电脑
方法/步骤
1、首先,制选择要拷贝文件的电脑文件。