当前位置:首页 » 操作系统 » udp文件传输源码

udp文件传输源码

发布时间: 2022-10-10 02:48:44

㈠ 谁能给我一个基于DUP协议的可靠数据传输的源代码

如何用vb的winsocket解决udp文件传送丢包的问题

udp协议是1种无连接的协议,他和tcp协议比较有传输速度快,占用资源少的问题。
但是由于udp协议本身没有自动找包的功能,因此经常会出现丢包的现象,会造成传送的文件丢包的现象
因为时间匆忙和水平有限,本人在效率上没有作优化,只是简单的实现,请大家自己看源码
注释:
主要功能:把文件猜成4k大小的包 在包头+上包的长度 接受了1个包判断长度是否和接受的长度相符如果

符合那么就继续发,如果出现丢包那么就从发
希望大家有什么好的建议通知我,我会尽量完善的
Option Explicit
'==============================================
'===============================
'udp传文件
'客户端
'作者: 影子
'================================
'==============================================
Dim FileNumber As Integer '用来存文件的句柄
Dim LenFile As Long '文件的长度
Private Sub Command2_Click()
closefile
End Sub

Private Sub Form_Load()
Winsock0.LocalPort = 5698
Winsock0.Bind
beginfile
End Sub
Private Sub Winsock0_DataArrival(ByVal bytesTotal As Long)
Dim FileByte() As Byte
Winsock0.GetData FileByte, vbArray + vbByte '接收类型为:字节数组
Dim mendByte() As Byte, i As Long, j As Long
Dim temp As String, temp1 As String
'获得包长
j = UBound(FileByte)
'合并包头
For i = 0 To 7 Step 2
temp = temp & Chr(FileByte(i))
Next
'比较长度看丢包没有
If Val(temp) = j Then

ReDim mendByte(j - 8)
' 提出包头
For i = 0 To j - 8
mendByte(i) = FileByte(i + 7)
Next
' 写文件
Put #FileNumber, , mendByte
' 发送继续发送的请求
frmmain.Winsock0.SendData "ok"
Else
'出现丢包,请求重发
frmmain.Winsock0.SendData "no"
End If
End Sub

Public Sub beginfile()
FileNumber = FreeFile '取得未使用的文件号
Open "c:\aaa.exe" For Binary As #FileNumber '打开文件
End Sub

Public Sub closefile() '关闭文件句柄
Close #FileNumber
End Sub

Option Explicit
Dim GetFileNum As Integer
Dim LenFile As Long
Dim Sendbaye() As Byte '发送的包
'===============================
'udp传文件
'作者: 影子
'服务器端
'================================

Private Sub Command1_Click()
GetFileNum = FreeFile '取得未使用的文件号
LenFile = FileLen("d:\aa.rar") '获得需传送的文件的长度
Open "d:\aa.rar" For Binary As #GetFileNum '打开需传送的文件
Command1.Enabled = False
' 传送文件
Call TCPSendFile(frmmain.Winsock0, GetFileNum, SplitFile)
Text1.Text = Now
End Sub

Private Sub Form_Load()
frmmain.Winsock0.RemoteHost = "192.168.0.12" '服务器ip
frmmain.Winsock0.RemotePort = 5698

End Sub
'=========================================================================
'为了清晰,下面分别用两个子过程来完成计算这次还可以传多少个字节的数据和传送数据
'==========================================================================
Private Function SplitFile() As Long '拆包
On Error Resume Next
Dim GetCount As Long
'计算出这次可发送的字节数
If LenFile >= 4000 Then
GetCount = 4000
LenFile = LenFile - GetCount
Else
GetCount = LenFile
LenFile = LenFile - GetCount
End If
SplitFile = GetCount

End Function
Private Sub TCPSendFile(objWinSock As Winsock, FileNumber As Integer, SendLen As Long)
Dim FileByte() As Byte, i As Long, j As Long
Dim temp As String
ReDim Sendbaye(0)

Dim tempa As String * 4
ReDim FileByte(SendLen - 1)
tempa = SendLen + 7
Sendbaye = tempa ' 把长度负值给包头
Get #FileNumber, , FileByte '读取文件
ReDim Preserve Sendbaye(SendLen + 7) '把包头+到文件头
For i = 0 To UBound(FileByte)
Sendbaye(i + 7) = FileByte(i)
Next
frmmain.Winsock0.SendData Sendbaye
End Sub

Private Sub Winsock0_DataArrival(ByVal bytesTotal As Long)
Dim str As String
frmmain.Winsock0.GetData str
Select Case str
Case "ok"
'成功继续发送
If LenFile = 0 Then '发送完成
MsgBox "成功"
Exit Sub
End If
Call TCPSendFile(frmmain.Winsock0, GetFileNum, SplitFile)
Case "no"
'不成功重发上一个包
frmmain.Winsock0.SendData Sendbaye
End Select
End Sub

㈡ C语言 UDP文件传输

void ThreadReceive(PVOID param)
{
static struct sockaddr_in server; // 绑定地址
static SOCKET ListenSocket; // 等待接收数据的socket
char buf[4096];
int len = sizeof(client);
int result;

ListenSocket = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);

if (ListenSocket == INVALID_SOCKET)
{
perror("opening stream socket");
exit(0);
}

server.sin_family = PF_INET;
server.sin_addr.s_addr = htonl( INADDR_ANY ); // 任何地址
server.sin_port = htons(LOCAL_PORT);

if (SOCKET_ERROR == bind(ListenSocket, (struct sockaddr *)&server, sizeof(server)) )
{
printf("Error: 绑定失败\n");
exit(1);
closesocket( ListenSocket );
}
printf("socket port %d \n", ntohs(server.sin_port));

while(TRUE)
{
//接收数据
result = recvfrom(ListenSocket, buf, sizeof(buf)-1, 0, (struct sockaddr *)&client, &len);
if ( result > 0 )
{
buf[result] = 0;
inet_ntoa(client.sin_addr), ntohs(client.sin_port));
}
}
closesocket(ListenSocket);
}

㈢ 求一个UDP套接字文件传输的C/C++代码

你的问题是一个伪命题!
如果不用TCP/IP协议,自己写底层协议的话,基本上不可实现:
1)你需要编写驱动网卡的驱动程序---涉及操作系统内核编程
2)你需要定义自己的应用协议模块,该模块调用网卡驱动,从头造轮子,属于重复工作,在现在来说,基本没什么意义!

㈣ 请教用C语言编的借助UDP协议实现的文件传输的程序

server代码
#include<sys/socket.h>;
#include<string.h>;
#include<netinet/in.h>;
#include<stdio.h>;
#include<stdlib.h>;
#include<fcntl.h>;
#include<sys/stat.h>;
#include<unistd.h>;
#include<errno.h>;
#include<sys/select.h>;
#include<sys/time.h>;
#include<unistd.h>;
#include<sys/types.h>;

#define SERV_PORT 2500
#define MAX_SIZE 1024*40

void recvUDP(char name[20],int sockfd)
{
int ret,fd;
mode_t fdmode = (S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);
char mesg[MAX_SIZE];
fd_set rdset;
struct timeval tv;
int rlen,wlen;
int i;

fd = open(name,O_RDWR|O_CREAT|O_APPEND,fdmode);
if(fd == -1)
{
printf("open file %s error:%n",name,strerror(errno));
exit(-1);
}

for(i=0;;i++)
{
tv.tv_sec = 1;
tv.tv_usec = 0;

FD_ZERO(&rdset);
FD_SET(sockfd,&rdset);

ret = select(sockfd+1,&rdset,NULL,NULL,&tv);
if(ret == -1)
{
printf("select error %s\n",strerror(errno));
exit(-1);
}
else if(ret==0)
{
printf("select timeout,continue circle\n");
continue;
}

if(FD_ISSET(sockfd,&rdset))
{
memset(mesg,0,MAX_SIZE);
rlen = read(sockfd,mesg,MAX_SIZE);
if(rlen <=0 )
{
printf("read error %s\n",strerror(errno));
exit(-1);
}

if(!strcmp(mesg,"end"))
{
printf("recv end.\n");
break;
}

wlen = write(fd,mesg,rlen);
if(wlen != rlen )
{
printf("write error %s\n",strerror(errno));
exit(-1);
}
}

printf("The %d times write\n",i);
}

close(fd);
}

int main(int argc, char *argv[])
{
int sockfd;
int r;
struct sockaddr_in servaddr;

sockfd = socket(AF_INET,SOCK_DGRAM,0); /*create a socket*/

/*init servaddr*/
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(SERV_PORT);

/*bind address and port to socket*/
if(bind(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr)) == -1)
{
perror("bind error");
exit(-1);
}

r = fcntl(sockfd, F_GETFL, 0);
fcntl(sockfd, F_SETFL, r & ~O_NONBLOCK);

recvUDP(argv[1],sockfd);

return 0;

}
client代码
#include<sys/types.h>;
#include<sys/socket.h>;
#include<string.h>;
#include<netinet/in.h>;
#include<stdio.h>;
#include<stdlib.h>;
#include<arpa/inet.h>;
#include<fcntl.h>;
#include<sys/stat.h>;
#include<errno.h>;
#include<sys/sysinfo.h>;
#include<sys/select.h>;
#include<sys/time.h>;
#include<unistd.h>;

#define MAX_SIZE 1024*40
#define SERV_PORT 2500

void connectUDP(char name[20],int sockfd,struct sockaddr *pservaddr,socklen_t servlen)
{
char buf[MAX_SIZE];
fd_set wrset;
struct timeval tv;
int rlen,wlen;
int fd;
int ret;
int i;

if(connect(sockfd,(struct sockaddr *)pservaddr,servlen) == -1)
{
perror("connet error");
exit(1);
}
else
printf("connect server ok!\n");

fd = open(name,O_RDONLY);
if(fd==-1)
{
printf("fopen error %s\n",strerror(errno));
exit(-1);
}

i=0;

while(1)
{
tv.tv_sec = 1;
tv.tv_usec = 0;

FD_ZERO(&wrset);
FD_SET(sockfd,&wrset);

ret = select(sockfd+1,NULL,&wrset,NULL,&tv);
if(ret == -1)
{
printf("select error %s\n",strerror(errno));
exit(-1);
}
else if(ret==0)
{
printf("select timeout,continue circle\n");
continue;
}

memset(buf,0,MAX_SIZE);
if(FD_ISSET(sockfd,&wrset))
{
rlen = read(fd,buf,MAX_SIZE);
if(rlen <0)
{
printf("fread data error %s\n",strerror(errno));
exit(-1);
}
else if(rlen==0)
{
wlen = write(sockfd,"end",3);
if(wlen !=3)
{
printf("write end error\n",strerror(errno));
exit(-1);
}

printf("all complete\n");

close(fd);
close(sockfd);
exit(0);
}

wlen = write(sockfd,buf,rlen);
if(wlen != rlen)
{
printf("write data to sockfd error:%s\n",strerror(errno));
exit(-1);
}

i++;

usleep(500);
printf("The %d times read\n",i);
}
}
}

int main(int argc ,char *argv[])
{
char *fh;
struct sysinfo s_info;
float time1,time2;
int error1,error2;
int sockfd;
struct stat fsize;
struct sockaddr_in servaddr;
error1= sysinfo(&s_info);
time1 = s_info.uptime;
int r;

if(argc != 3)
{
printf("useage:udpclient<IPaddress>;\n");
exit(1);
}
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family= AF_INET;
servaddr.sin_port = htons(SERV_PORT);

if(inet_pton(AF_INET,argv[1],&servaddr.sin_addr) <= 0)
{
printf("[%s]is not a valid IPaddress\n",argv[1]);
exit(1);
}
fh = argv[2];

sockfd =socket(AF_INET,SOCK_DGRAM,0);

r = fcntl(sockfd, F_GETFL, 0);
fcntl(sockfd, F_SETFL, r & ~O_NONBLOCK);

connectUDP(argv[2],sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr));
fprintf(stderr,"ServerIP:\t%s\n",argv[1]);
if(stat(argv[2],&fsize) == -1)
perror("failed to get fiel statusi\n");
else
fprintf(stderr,"file name:\t%s\nfile size:\t%dK\n",argv[2],fsize.st_size/1024);
error2=sysinfo(&s_info);
time2 = s_info.uptime;
printf("tranfice file time =%fs\n",(time2-time1));
}
makefile
all:send recv

send:send.c
gcc -Wall send.c -o send
recv:recv.c
gcc -Wall recv.c -o recv

clean:
rm -rf send recv

㈤ 请教用C语言编的借助UDP协议实现的文件传输的程序

本程序在 Windows 7 Visual Studio 2015 和 linux Ubuntu 15.04 GCC 5.11 下均编译运行测试通过。

本程序支持 Windows 和 Linux 之间传送文件,如果要在 Windows 和 Linux 之间传送文件,文件名不能出现中文。

本程序支持无线 WiFi,支持 USB 收发器,但仅支持局域网内传送文件,传送文件需要输入对方的 IP 地址。

本程序包括服务器端和客户端,既可以发送文件又可以接收文件。如果要在同一台机器上测试需要同时打开两个程序。

Windows 下查看本机 IP 地址的命令是:

ipconfig

Linux 下查看本机 IP 地址的命令是:

ifconfig

以下是程序代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>

#ifdef_MSC_VER
#include<winsock2.h>
#include<windows.h>
#pragmacomment(lib,"ws2_32.lib")
#else
#include<pthread.h>
#include<unistd.h>
#include<signal.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#endif

//存放发送接收字符数组大小
#defineSIZEA65501
//每次发送接收字节数
#defineSIZEB65500

typedefstructsockaddr_inSockAddrIn;
SockAddrInserverAddr,remoteAddr,clientAddr;

//端口号
intiServerPort,iClientPort;
//新建socket信息
intiUDP;

//字符串转整型
intstrToInt(char*acStr)
{
inti,iIndex=0,iNum=0,iSize=0;
if(acStr[0]=='+'||acStr[0]=='-')
iIndex=1;

for(iSize=iIndex;;iSize++)
if(acStr[iSize]<'0'||acStr[iSize]>'9')
break;

for(i=iIndex;i<iSize;i++)
iNum+=(int)pow(10,iSize-i-1)*(acStr[i]-48);

if(acStr[0]=='-')
iNum=-iNum;

returniNum;
}

//整型转字符串
voidintToStr(intiInt,char*acStr)
{
intiIndex=0,iSize,iNum,iBit,i,j;

if(iInt<0)
{
acStr[0]='-';
iInt=-iInt;
iIndex=1;
}
for(i=0;;i++)
if(iInt<pow(10,i))
break;
iSize=i;

for(i=0;i<iSize;i++)
{
iNum=pow(10,iSize-i-1);
iBit=iInt/iNum;
iInt-=iNum*iBit;
acStr[i+iIndex]=iBit+48;
}
if(iSize!=0)
acStr[iSize+iIndex]='';
else
{
acStr[0]='0';
acStr[1]='';
}
}

voidsleepUDP(intiSleep)
{
#ifdef_MSC_VER
Sleep(iSleep);
#else
usleep(iSleep*1000);
#endif
}

voidopenUDP(char*acIpAddr)
{
#ifdef_MSC_VER
//Winsows启用socket
WSADATAwsadata;
if(WSAStartup(MAKEWORD(1,1),&wsadata)==SOCKET_ERROR)
{
printf("启用socket失败 ");
exit(0);
}
#endif

//新建socket
if((iUDP=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP))==-1)
{
printf("新建socket失败 ");
exit(0);
}

//清零
memset(&serverAddr,0,sizeof(serverAddr));
memset(&clientAddr,0,sizeof(clientAddr));

//设置协议IP地址及Port
serverAddr.sin_family=AF_INET;
serverAddr.sin_port=htons(iServerPort);
serverAddr.sin_addr.s_addr=htonl(INADDR_ANY);

clientAddr.sin_family=AF_INET;
clientAddr.sin_port=htons(iClientPort);
clientAddr.sin_addr.s_addr=inet_addr(acIpAddr);

//绑定端口,监听端口
if(bind(iUDP,(structsockaddr*)&serverAddr,sizeof(serverAddr))==-1)
{
printf("绑定端口失败 ");
exit(0);
}
}

voidcloseUDP(void)
{
#ifdef_MSC_VER
//Winsows关闭socket
closesocket(iUDP);
WSACleanup();
#endif
}

//要发送的字符串
characSendStr[SIZEA];
//接收到的字符串
characRecvStr[SIZEA];
//请求信息
characReq[SIZEA];
//文件名字符串
characFileName[SIZEA];
//文件字节数字符串
characFileSize[SIZEA];

intiSize,iNameSize;

//接收文件名
#ifdef_MSC_VER
DWORDWINAPIrecvName(LPVOIDp)
#else
void*recvName(void*arg)
#endif
{
intiAddrSize=sizeof(remoteAddr);
acReq[0]='n';acReq[1]='a';acReq[2]='m';acReq[3]='e';acReq[4]='';
acRecvStr[0]='';
printf("%s ","正在发送请求信息!");
//发送请求信息
sendto(iUDP,acReq,strlen(acReq),0,(structsockaddr*)&clientAddr,sizeof(clientAddr));
//每次发送请求信息后等待一段时间
sleepUDP(10);
//接收文件名
iSize=recvfrom(iUDP,acRecvStr,SIZEB,0,(structsockaddr*)&remoteAddr,&iAddrSize);
return0;
}

//接收文件
voidrecvFile(char*acDirName,char*acIpAddr)
{
FILE*pFile=NULL;
inti,iFileSize,iRecvNum,iAddrSize=sizeof(remoteAddr);
//路径文件名
characDirAndFileName[SIZEA];

openUDP(acIpAddr);
//接收文件名
for(;;)
{
//创建线程
#ifdef_MSC_VER
HANDLEhThread;
DWORDthreadId;
hThread=CreateThread(NULL,0,recvName,0,0,&threadId);
//每次发送后等待一段时间
sleepUDP(1000);
//强制终止线程
TerminateThread(hThread,0);
#else
pthread_tthread;
void*thread_arg=(pthread_t)0;
pthread_create(&thread,NULL,recvName,(void*)&thread_arg);
//每次发送后等待一段时间
sleepUDP(1000);
//强制终止线程
pthread_cancel(thread);
#endif
if(acRecvStr[0]!='')
{
acRecvStr[iSize]='';
printf("文件名为:%s ",acRecvStr);
break;
}
}

acDirAndFileName[0]='';
strcat(acDirAndFileName,acDirName);
//连接路径名和文件名
strcat(acDirAndFileName,acRecvStr);
//如果已经有这个文件了就清空文件内容
pFile=fopen(acDirAndFileName,"w");
fclose(pFile);

acReq[0]='s';acReq[1]='i';acReq[2]='z';acReq[3]='e';acReq[4]='';
//接收文件字节数
for(;;)
{
//发送请求信息
sendto(iUDP,acReq,strlen(acReq)+1,0,(structsockaddr*)&clientAddr,sizeof(clientAddr));
//每次发送请求信息后等待一段时间
sleepUDP(10);
//接收文件字节数
acRecvStr[0]='';
iSize=recvfrom(iUDP,acRecvStr,SIZEB,0,(structsockaddr*)&remoteAddr,&iAddrSize);
if(acRecvStr[0]!='')
{
acRecvStr[iSize]='';
iFileSize=strToInt(acRecvStr);
printf("文件字节数为:%d ",iFileSize);
break;
}
}

//以追加方式写入文件
pFile=fopen(acDirAndFileName,"ab");
//文件分几次接收
iRecvNum=iFileSize/SIZEB;
//接收文件
for(i=0;i<iRecvNum;i++)
{
intToStr(i,acReq);
for(;;)
{
//发送请求信息
sendto(iUDP,acReq,strlen(acReq)+1,0,(structsockaddr*)&clientAddr,sizeof(clientAddr));
printf("%s 正在接收文件的第%d段 ",acReq,i);
//每次发送请求信息后等待一段时间
sleepUDP(10);
//接收一段文件
iSize=recvfrom(iUDP,acRecvStr,SIZEB,0,(structsockaddr*)&remoteAddr,&iAddrSize);
if(iSize==SIZEB)
{
//以追加方式写入文件
fwrite(acRecvStr,sizeof(char),iSize,pFile);
break;
}
}
}
//接收文件剩余字节
iSize=iFileSize%SIZEB;
if(iSize>0)
{
acReq[0]='l';acReq[1]='a';acReq[2]='s';acReq[3]='t';acReq[4]='';
for(;;)
{
//发送请求信息
sendto(iUDP,acReq,strlen(acReq)+1,0,(structsockaddr*)&clientAddr,sizeof(clientAddr));
//每次发送请求信息后等待一段时间
sleepUDP(10);
//接收文件剩余字节
if(recvfrom(iUDP,acRecvStr,iSize,0,(structsockaddr*)&remoteAddr,&iAddrSize)==iSize)
{
//以追加方式写入文件
fwrite(acRecvStr,sizeof(char),iSize,pFile);
break;
}
}
}
printf("%s ","文件接收完毕!");

//关闭文件
fclose(pFile);
//关闭连接
closeUDP();
}

//发送文件名
#ifdef_MSC_VER
DWORDWINAPIsendName(LPVOIDp)
#else
void*sendName(void*arg)
#endif
{
intiAddrSize=sizeof(remoteAddr);
acRecvStr[0]='';
//接收请求
printf("%s ","正在接收请求信息!");
recvfrom(iUDP,acRecvStr,5,0,(structsockaddr*)&remoteAddr,&iAddrSize);
//每次接收请求信息后等待一段时间
sleepUDP(10);
//如果请求信息正确发送文件名
if(acRecvStr[0]=='n'&&acRecvStr[1]=='a'&&acRecvStr[2]=='m'&&acRecvStr[3]=='e'&&acRecvStr[4]=='')
sendto(iUDP,acFileName,iNameSize,0,(structsockaddr*)&clientAddr,sizeof(clientAddr));
return0;
}

//发送文件
voidsendFile(char*acDirAndFileName,char*acIpAddr)
{
inti,j,iFileSize,iSendNum,iAddrSize=sizeof(remoteAddr);
FILE*pFile=NULL;

pFile=fopen(acDirAndFileName,"rb");
fseek(pFile,0,SEEK_END);
//文件字节数
iFileSize=ftell(pFile);
intToStr(iFileSize,acFileSize);
//printf("%s ",acDirAndFileName);

//获取文件名长度
iSize=strlen(acDirAndFileName);
for(i=iSize-1,iNameSize=0;i>=0;i--,iNameSize++)
if(acDirAndFileName[i]=='\'||acDirAndFileName[i]=='/')
break;
//printf("%d ",iNameSize);

//截取文件名
for(i=0;i<iNameSize;i++)
acFileName[i]=acDirAndFileName[iSize-iNameSize+i];
acFileName[iNameSize]='';
//printf("%s ",acFileName);

openUDP(acIpAddr);
//发送文件名
for(;;)
{
//创建线程
#ifdef_MSC_VER
HANDLEhThread;
DWORDthreadId;
hThread=CreateThread(NULL,0,sendName,0,0,&threadId);
//每次接收请求信息后等待一段时间
sleepUDP(1000);
//强制终止线程
TerminateThread(hThread,0);
#else
pthread_tthread;
void*thread_arg=(pthread_t)0;
pthread_create(&thread,NULL,sendName,(void*)&thread_arg);
//每次接收请求信息后等待一段时间
sleepUDP(1000);
//强制终止线程
pthread_cancel(thread);
#endif
//如果请求信息正确退出循环
if(acRecvStr[0]=='n'&&acRecvStr[1]=='a'&&acRecvStr[2]=='m'&&acRecvStr[3]=='e'&&acRecvStr[4]=='')
break;
}
//发送文件字节数
for(;;)
{
acRecvStr[0]='';
//接收请求
recvfrom(iUDP,acRecvStr,5,0,(structsockaddr*)&remoteAddr,&iAddrSize);
//每次接收请求信息后等待一段时间
sleepUDP(10);
//如果请求信息正确
if(acRecvStr[0]=='s'&&acRecvStr[1]=='i'&&acRecvStr[2]=='z'&&acRecvStr[3]=='e'&&acRecvStr[4]=='')
{
//发送文件字节数
sendto(iUDP,acFileSize,strlen(acFileSize),0,(structsockaddr*)&clientAddr,sizeof(clientAddr));
break;
}
}

iSendNum=iFileSize/SIZEB;
//发送文件
if(iSendNum>0)
{
for(i=0;;i++)
{
acRecvStr[0]='';
//接收请求
recvfrom(iUDP,acRecvStr,SIZEB,0,(structsockaddr*)&remoteAddr,&iAddrSize);
printf("%s 正在发送文件的第%d段 ",acRecvStr,i);
//每次接收请求信息后等待一段时间
sleepUDP(10);
fseek(pFile,strToInt(acRecvStr)*SIZEB,SEEK_SET);
fread(acSendStr,1,SIZEB,pFile);
//printf("%s ",acSendStr);
//发送一段文件
sendto(iUDP,acSendStr,SIZEB,0,(structsockaddr*)&clientAddr,sizeof(clientAddr));
if(strToInt(acRecvStr)>=iSendNum-1)
break;
}
}
//发送文件剩余字节
iSize=iFileSize%SIZEB;
if(iSize>0)
{
for(;;)
{
acRecvStr[0]='';
//接收请求
recvfrom(iUDP,acRecvStr,5,0,(structsockaddr*)&remoteAddr,&iAddrSize);
//每次接收请求信息后等待一段时间
sleepUDP(10);
//如果请求信息正确
if(acRecvStr[0]=='l'&&acRecvStr[1]=='a'&&acRecvStr[2]=='s'&&acRecvStr[3]=='t'&&acRecvStr[4]=='')
{
fseek(pFile,iSendNum*SIZEB,SEEK_SET);
fread(acSendStr,1,iSize,pFile);
//printf("%s ",acSendStr);
//发送文件剩余字节
sendto(iUDP,acSendStr,iSize,0,(structsockaddr*)&clientAddr,sizeof(clientAddr));
break;
}
}
}
printf("%s ","文件发送完毕!");

//关闭连接
closeUDP();
}

intmain(void)
{
characDirName[SIZEA];
characDirAndFileName[SIZEA];
characIpAddr[15];
inti,iOption=0,iSize=0;
FILE*pFile=NULL;
charcLast='\';

option:
printf("%s ","**************************************************** 本程序包括服务器端和客户端,既可以发送文件又可以接收文件。 支持无线WiFi,支持USB收发器,但仅支持局域网内传送文件。 如果要在Windows和Linux之间传送文件,文件名不能出现中文。 如果要在同一台机器上测试需要同时打开两个程序。 ****************************************************");
printf("%s ","请输入选项,1.发送文件、2.接收文件。");
scanf("%d",&iOption);

//发送文件
if(iOption==1)
{
iServerPort=1025;
iClientPort=1024;
fileName:
printf("%s ","请输入需要发送的路径文件名。 Windows路径文件名格式: C:\install.txt Linux路径文件名格式: /home/install.txt");
scanf("%s",acDirAndFileName);
pFile=fopen(acDirAndFileName,"rb");
if(pFile==NULL)
{
printf("%s ","读取文件失败,请重新输入文件名。");
gotofileName;
}
//关闭文件
fclose(pFile);

printf("%s ","请输入接收文件方的IP地址,不能有空格。 例如: 192.168.1.104");
scanf("%s",acIpAddr);

sendFile(acDirAndFileName,acIpAddr);
}
//接收文件
elseif(iOption==2)
{
iServerPort=1024;
iClientPort=1025;
dirName:
printf("%s ","请输入保存文件的路径名。 Windows路径名格式: C:\img\ Linux路径名格式: /home/");
scanf("%s",acDirName);

iSize=strlen(acDirName);
//检查是不是Linux路径名
for(i=0;i<iSize;i++)
{
if(acDirName[i]=='/')
{
cLast='/';
break;
}
}
//检查路径名最后一个字符是不是或/
if(acDirName[iSize-1]!=cLast)
{
acDirName[iSize]=cLast;
acDirName[iSize+1]='';
}
acDirAndFileName[0]='';
strcat(acDirAndFileName,acDirName);
strcat(acDirAndFileName,"a.txt");
//试探保存一个无关紧要的文件
pFile=fopen(acDirAndFileName,"w");
if(pFile==NULL)
{
printf("%s ","该路径无法创建文件,请重新输入路径名。");
gotodirName;
}
else
{
//关闭文件
fclose(pFile);
//删除文件
remove(acDirAndFileName);
}

printf("%s ","请输入发送文件方的IP地址,不能有空格。 例如: 192.168.2.249");
scanf("%s",acIpAddr);

recvFile(acDirName,acIpAddr);
}
else
{
printf("%s ","没有这个选项,请重新输入。");
gotooption;
}

return0;
}

㈥ C#udp文件传输程序

使用UDP协议进行文件传输不能保证正确性,很容易发生丢包的情况。建议在进行较大文件传输的时候使用TCP的Socket和ServerSocket类进行传输。在数据量小于65600字节的时候使用UDP是安全的

如果一定要使用UDP方式进行传输的话,为了提高传输的准确性,可以限制一下传输速度,方法是在发送端每次发送后sleep一下,即在发送端程序的dataSocket.send(dataPacket);一句后加上:
TimeUnit.MICROSECONDS.sleep(1);
不过这种方法也不能保证传输绝对准确,所以还是建议用TCP的方式

程序本身应该是能够达到效果的,不知道错误提示是什么。测试之前要看下发送端的filePath文件是否存在,貌似防火墙也有影响,测试之间最好关闭防火墙。下面是我的测试程序,接收端是类A1,接收端是类A2,发送端的文件filePath是D盘根目录下的a1.mkv:

接收端:
import java.io.BufferedOutputStream;
import java.io.DataOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class A1 {
public static DatagramSocket dataSocket;
public static final int PORT=7;
public static byte[] receiveByte;
public static DatagramPacket dataPacket;
public static void main(String[] args) throws IOException{
dataSocket = new DatagramSocket(PORT);
DataOutputStream fileOut = new DataOutputStream(new BufferedOutputStream(new BufferedOutputStream(new FileOutputStream("D:\\a.mkv"))));
int i = 0;
while (i == 0)// 无数据,则循环

{
receiveByte = new byte[1024];
dataPacket = new DatagramPacket(receiveByte, receiveByte.length);
dataSocket.receive(dataPacket);
i = dataPacket.getLength();
// 接收数据

if (i > 0) {
// 指定接收到数据的长度,可使接收数据正常显示,开始时很容易忽略这一点

fileOut.write(receiveByte,0,i);
fileOut.flush();
i = 0;// 循环接收
}

}
}
}

发送端:

import java.io.BufferedInputStream;
import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.Inet4Address;
import java.util.Date;

public class A2 {
public static DatagramSocket dataSocket;
public static final int PORT=7;
public static byte[] sendDataByte;
public static DatagramPacket dataPacket;
public static void main(String[] args) throws IOException, InterruptedException{
String filePath="D:\\a1.mkv";
DataInputStream fis = new DataInputStream(new BufferedInputStream(new FileInputStream(filePath)));
dataSocket = new DatagramSocket(PORT+1);
sendDataByte = new byte[1024];
int read=0;
long a=new Date().getTime();
while(true){
if (fis != null) {
read = fis.read(sendDataByte);
}

if (read == -1) {
System.out.println(new Date().getTime()-a);
break;
}
dataPacket = new DatagramPacket(sendDataByte, sendDataByte.length,(Inet4Address) Inet4Address.getByName("localhost"), PORT);
dataSocket.send(dataPacket);
TimeUnit.MICROSECONDS.sleep(1);//限制传输速度
}
}
}

㈦ C#udp文件传输程序

为什么在创建了Udp方式的Socket类后,还继续创建一个 Udpclient去进行传输。直接用 Socket的ReceiveFrom不就可以了么?
Socket newsock=.....
newsock.ReceiveFrom(...

㈧ Go 语言自我提升 (三次握手 - 四次挥手 - TCP状态图 - udp - 网络文件传输)

三次握手:

            1. 主动发起连接请求端(客户端),发送 SYN 标志位,携带数据包、包号

            2. 被动接收连接请求端(服务器),接收 SYN,回复 ACK,携带应答序列号。同时,发送SYN标志位,携带数据包、包号

            3. 主动发起连接请求端(客户端),接收SYN 标志位,回复 ACK。

                        被动端(服务器)接收 ACK —— 标志着 三次握手建立完成( Accept()/Dial() 返回 )

四次挥手:

            1. 主动请求断开连接端(客户端), 发送 FIN标志,携带数据包

            2. 被动接受断开连接端(服务器), 发送 ACK标志,携带应答序列号。 —— 半关闭完成。

            3. 被动接受断开连接端(服务器), 发送 FIN标志,携带数据包

            4. 主动请求断开连接端(客户端), 发送 最后一个 ACK标志,携带应答序列号。—— 发送完成,客户端不会直接退出,等 2MSL时长。

                        等 2MSL待目的:确保服务器 收到最后一个ACK

滑动窗口:

            通知对端本地存储数据的 缓冲区容量。—— write 函数在对端 缓冲区满时,有可能阻塞。

TCP状态转换:

            1. 主动发起连接请求端:

                        CLOSED ——> 发送SYN ——> SYN_SENT(了解) ——> 接收ACK、SYN,回发 ACK ——> ESTABLISHED (数据通信)

            2. 主动关闭连接请求端:

                        ESTABLISHED ——> 发送FIN ——> FIN_WAIT_1 ——> 接收ACK ——> FIN_WAIT_2 (半关闭、主动端)

                        ——> 接收FIN、回复ACK ——> TIME_WAIT (主动端) ——> 等 2MSL 时长 ——> CLOSED

            3. 被动建立连接请求端:

                        CLOSED ——> LISTEN ——> 接收SYN、发送ACK、SYN ——> SYN_RCVD ——> 接收 ACK ——> ESTABLISHED (数据通信)

            4. 被动断开连接请求端:

                        ESTABLISHED ——> 接收 FIN、发送 ACK ——> CLOSE_WAIT ——> 发送 FIN ——> LAST_ACK ——> 接收ACK ——> CLOSED

windows下查看TCP状态转换:

            netstat -an | findstr  端口号

Linux下查看TCP状态转换:

            netstat -an | grep  端口号

TCP和UDP对比: 

            TCP: 面向连接的可靠的数据包传递。 针对不稳定的 网络层,完全弥补。ACK

            UDP:无连接不可靠的报文传输。 针对不稳定的 网络层,完全不弥补。还原网络真实状态。

                                    优点                                                             缺点

            TCP: 可靠、顺序、稳定                                      系统资源消耗大,程序实现繁复、速度慢

            UDP:系统资源消耗小,程序实现简单、速度快                          不可靠、无序、不稳定

使用场景:

            TCP:大文件、可靠数据传输。 对数据的 稳定性、准确性、一致性要求较高的场合。

            UDP:应用于对数据时效性要求较高的场合。 网络直播、电话会议、视频直播、网络游戏。

UDP-CS-Server实现流程:

            1.  创建 udp地址结构 ResolveUDPAddr(“协议”, “IP:port”) ——> udpAddr 本质 struct{IP、port}

            2.  创建用于 数据通信的 socket ListenUDP(“协议”, udpAddr ) ——> udpConn (socket)

            3.  从客户端读取数据,获取对端的地址 udpConn.ReadFromUDP() ——> 返回:n,clientAddr, err

            4.  发送数据包给 客户端 udpConn.WriteToUDP("数据", clientAddr)

UDP-CS-Client实现流程:

            1.  创建用于通信的 socket。 net.Dial("udp", "服务器IP:port") ——> udpConn (socket)

            2.  以后流程参见 TCP客户端实现源码。

UDPserver默认就支持并发!

------------------------------------

命令行参数: 在main函数启动时,向整个程序传参。 【重点】

            语法: go run xxx.go   argv1 argv2  argv3  argv4 。。。

                        xxx.exe:  第 0 个参数。

                        argv1 :第 1 个参数。

                        argv2 :第 2 个参数。

                        argv3 :第 3 个参数。

                        argv4 :第 4 个参数。

            使用: list := os.Args  提取所有命令行参数。

获取文件属性函数:

            os.stat(文件访问绝对路径) ——> fileInfo 接口

            fileInfo 包含 两个接口。

                        Name() 获取文件名。 不带访问路径

                        Size() 获取文件大小。

网络文件传输 —— 发送端(客户端)

            1.  获取命令行参数,得到文件名(带路径)filePath list := os.Args

            2.  使用 os.stat() 获取 文件名(不带路径)fileName

            3.  创建 用于数据传输的 socket  net.Dial("tcp", “服务器IP+port”) —— conn

            4.  发送文件名(不带路径)  给接收端, conn.write()

            5.  读取 接收端回发“ok”,判断无误。封装函数 sendFile(filePath, conn) 发送文件内容

            6.  实现 sendFile(filePath,  conn)

                        1) 只读打开文件 os.Open(filePath)

                                    for {

                                    2) 从文件中读数据  f.Read(buf)

                                    3) 将读到的数据写到socket中  conn.write(buf[:n])

                                    4)判断读取文件的 结尾。 io.EOF. 跳出循环

                                    }

网络文件传输 —— 接收端(服务器)

            1. 创建用于监听的 socket net.Listen() —— listener

            2. 借助listener 创建用于 通信的 socket listener.Accpet()  —— conn

            3. 读取 conn.read() 发送端的 文件名, 保存至本地。

            4. 回发 “ok”应答 发送端。

            5. 封装函数,接收文件内容 recvFile(文件路径)

                        1) f = os.Create(带有路径的文件名)

                        for {

                        2)从 socket中读取发送端发送的 文件内容 。 conn.read(buf)

                        3)  将读到的数据 保存至本地文件 f.Write(buf[:n])

                        4)  判断 读取conn 结束, 代表文件传输完成。 n == 0  break

                        }

            

㈨ linux下udp实现文件的传输,尽量详细点 思路我知道 就是不知道怎么把文件名给传过去

传文件最好用个TCP。UDP会丢包的

////////////////////////////////////
//客户端代码
///////////////////////////////////

//本文件是客户机的代码
#include <netinet/in.h> // for sockaddr_in
#include <sys/types.h> // for socket
#include <sys/socket.h> // for socket
#include <stdio.h> // for printf
#include <stdlib.h> // for exit
#include <string.h> // for bzero
#include <time.h> //for time_t and time
#include <arpa/inet.h>

#define HELLO_WORLD_SERVER_PORT 7754
#define BUFFER_SIZE 1024

int main(int argc, char **argv)
{
if (argc != 2)
{
printf("Usage: ./%s ServerIPAddress\n",argv[0]);
exit(1);
}

//time_t now;
FILE *stream;

//设置一个socket地址结构client_addr,代表客户机internet地址, 端口
struct sockaddr_in client_addr;
bzero(&client_addr,sizeof(client_addr)); //把一段内存区的内容全部设置为0
client_addr.sin_family = AF_INET; //internet协议族
client_addr.sin_addr.s_addr = htons(INADDR_ANY);//INADDR_ANY表示自动获取本机地址
client_addr.sin_port = htons(0); //0表示让系统自动分配一个空闲端口
//创建用于internet的流协议(TCP)socket,用client_socket代表客户机socket
int client_socket = socket(AF_INET,SOCK_STREAM,0);
if( client_socket < 0)
{
printf("Create Socket Failed!\n");
exit(1);
}
//把客户机的socket和客户机的socket地址结构联系起来
if( bind(client_socket,(struct sockaddr*)&client_addr,sizeof(client_addr)))
{
printf("Client Bind Port Failed!\n");
exit(1);
}

//设置一个socket地址结构server_addr,代表服务器的internet地址, 端口
struct sockaddr_in server_addr;
bzero(&server_addr,sizeof(server_addr));
server_addr.sin_family = AF_INET;
if(inet_aton(argv[1],&server_addr.sin_addr) == 0) //服务器的IP地址来自程序的参数
{
printf("Server IP Address Error!\n");
exit(1);
}
server_addr.sin_port = htons(HELLO_WORLD_SERVER_PORT);
socklen_t server_addr_length = sizeof(server_addr);
//向服务器发起连接,连接成功后client_socket代表了客户机和服务器的一个socket连接
if(connect(client_socket,(struct sockaddr*)&server_addr, server_addr_length) < 0)
{
printf("Can Not Connect To %s!\n",argv[1]);
exit(1);
}

char buffer[BUFFER_SIZE];
bzero(buffer,BUFFER_SIZE);

//从服务器接收数据到buffer中
int length = recv(client_socket,buffer,BUFFER_SIZE,0);

if(length < 0)
{
printf("Recieve Data From Server %s Failed!\n", argv[1]);
exit(1);
}

printf("\n%s\n",buffer);

bzero(buffer,BUFFER_SIZE);

bzero(buffer,BUFFER_SIZE);
strcpy(buffer,"Hello, World! From Client\n");
//向服务器发送buffer中的数据
send(client_socket,buffer,BUFFER_SIZE,0);

if((stream = fopen("data","w+t"))==NULL)
{
printf("The file 'data' was not opened! \n");
}

else
bzero(buffer,BUFFER_SIZE);
length = 0;
while( length = recv(client_socket,buffer,BUFFER_SIZE,0))
{
if(length < 0)
{
printf("Recieve Data From Server %s Failed!\n", argv[1]);
break;
}

int write_length = fwrite(buffer,sizeof(char),length,stream);
if (write_length<length)
{
printf("File is Write Failed\n");
break;
}
bzero(buffer,BUFFER_SIZE);
}
printf("Recieve File From Server[%s] Finished\n", argv[1]);

//关闭 文件
fclose(stream);

//关闭socket
close(client_socket);
return 0;
}

////////////////////////////////////
//服务器代码
///////////////////////////////////
//本文件是服务器的代码
#include <netinet/in.h> // for sockaddr_in
#include <sys/types.h> // for socket
#include <sys/socket.h> // for socket
#include <stdio.h> // for printf
#include <stdlib.h> // for exit
#include <string.h> // for bzero
#include <time.h> //for time_t and time

#define HELLO_WORLD_SERVER_PORT 7754
#define LENGTH_OF_LISTEN_QUEUE 20
#define BUFFER_SIZE 1024

int main(int argc, char **argv)
{
//设置一个socket地址结构server_addr,代表服务器internet地址, 端口
struct sockaddr_in server_addr;
bzero(&server_addr,sizeof(server_addr)); //把一段内存区的内容全部设置为0
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htons(INADDR_ANY);
server_addr.sin_port = htons(HELLO_WORLD_SERVER_PORT);
// time_t now;
FILE *stream;

//创建用于internet的流协议(TCP)socket,用server_socket代表服务器socket
int server_socket = socket(AF_INET,SOCK_STREAM,0);
if( server_socket < 0)
{
printf("Create Socket Failed!");
exit(1);
}

//把socket和socket地址结构联系起来
if( bind(server_socket,(struct sockaddr*)&server_addr,sizeof(server_addr)))
{
printf("Server Bind Port : %d Failed!", HELLO_WORLD_SERVER_PORT);
exit(1);
}

//server_socket用于监听
if ( listen(server_socket, LENGTH_OF_LISTEN_QUEUE) )
{
printf("Server Listen Failed!");
exit(1);
}

while (1) //服务器端要一直运行
{

struct sockaddr_in client_addr;
socklen_t length = sizeof(client_addr);

int new_server_socket = accept(server_socket,(struct sockaddr*)&client_addr,&length);
if ( new_server_socket < 0)
{
printf("Server Accept Failed!\n");
break;
}

char buffer[BUFFER_SIZE];
bzero(buffer, BUFFER_SIZE);

strcpy(buffer,"Hello,World! 从服务器来!");
strcat(buffer,"\n"); //C语言字符串连接

send(new_server_socket,buffer,BUFFER_SIZE,0);

bzero(buffer,BUFFER_SIZE);
//接收客户端发送来的信息到buffer中
length = recv(new_server_socket,buffer,BUFFER_SIZE,0);

if (length < 0)
{
printf("Server Recieve Data Failed!\n");
exit(1);
}
printf("\n%s",buffer);

if((stream = fopen("/home/administrator/110405A000.jpg","r"))==NULL)
{
printf("The file 'data1' was not opened! \n");
exit(1);
}
else

printf("The file 'filename' was opened! \n");
bzero(buffer,BUFFER_SIZE);

int lengsize = 0;
while((lengsize = fread(buffer,1,1024,stream)) > 0)
{

printf("lengsize = %d\n",lengsize);

if(send(new_server_socket,buffer,lengsize,0)<0)
{
printf("Send File is Failed\n");
break;
}

bzero(buffer, BUFFER_SIZE);

}
if(fclose(stream))
printf("The file 'data' was not closed! \n");
exit(1);

//关闭与客户端的连接
close(new_server_socket);
}
//关闭监听用的socket
close(server_socket);
return 0;
}

㈩ java UDP 传输文件

//Send
DatagramSocket ds = new DatagramSocket(5555, InetAddress
.getByName("10.0.0.1"));
InputStream in = new FileInputStream(new File("a.txt"));
byte[] b = new byte[10240];
int c = in.read(b);
in.close();
DatagramPacket dp = new DatagramPacket(b, c);
ds.send(dp);

//Receive
DatagramSocket ds2 = new DatagramSocket(5555);
DatagramPacket dp2 = new DatagramPacket(b,b.length);
ds2.receive(dp2);
OutputStream out=new FileOutputStream(new File("out.txt"));
out.write(dp2.getData());
out.close();

热点内容
一万级净化车间有哪些配置 发布:2025-05-15 12:16:41 浏览:97
javazip解压加密 发布:2025-05-15 12:15:02 浏览:941
dnf服务器存放什么信息 发布:2025-05-15 12:11:07 浏览:216
办公室视频剧本脚本 发布:2025-05-15 12:03:51 浏览:490
编译失败什么意思 发布:2025-05-15 11:58:18 浏览:87
lcs脚本官网 发布:2025-05-15 11:56:15 浏览:88
三国志战略版打9级矿什么配置 发布:2025-05-15 11:41:29 浏览:953
安卓加速器怎么关 发布:2025-05-15 11:38:16 浏览:465
密码锁坏了如何打开 发布:2025-05-15 11:30:19 浏览:838
怎样增加共享文件夹连接数量 发布:2025-05-15 11:24:50 浏览:962