花了差不多一天的時間,參照鄭老師上課的代碼自己摸索出來的udp協議檔案傳輸。具體功能如下
1.客戶端向服務器發送一個想要下載的檔案名
2.服務器接收這個檔案名,打開相應的檔案,讀取檔案內容,再發送回客戶端,檔案發送的完成用一個長度為0的udp報文段作為標志
3.客戶端將接收的資料寫入本地指定的檔案名中。
客戶端代碼:
//客戶端
#include<stdio.h>
#include<string.h>
#include<Winsock2.h>
#pragma comment(lib,"ws2_32.lib")
#define MAX_BUF 65536
int main()
{
WSAData wsaData;
int err=WSAStartup(WINSOCK_VERSION,&wsaData);
if(0!=err)
{
return -1;
}
SOCKET sock;
sock=socket(AF_INET,SOCK_DGRAM,0);
if(INVALID_SOCKET==sock)
{
printf("socket()Failed:%d\n",WSAGetLastError());
WSACleanup();
return -1;
}
char data[]="Hello World!";
char dest_ip[]="192.168.1.104 "; //目的IP
unsigned short dest_port=20000;//目的埠
sockaddr_in RemoteAddr;
RemoteAddr.sin_family = AF_INET;
RemoteAddr.sin_port = htons(dest_port);
RemoteAddr.sin_addr.s_addr=inet_addr(dest_ip);
char rbuf[MAX_BUF];
memset(rbuf,0,MAX_BUF);
int RemoteLen=sizeof(RemoteAddr);
char path[100]={"0"};
char name[100]={"0"};
printf("發送檔案名\n");
gets(path);
FILE *fp=fopen(path,"wb");
if(!fp)
{
printf("打開檔案失敗!");
return 1;
}
else
{
printf("檔案已打開,等待傳輸\n");
}
while(1)
{
sendto(sock,path,strlen(path),0,(sockaddr*)&RemoteAddr,sizeof(RemoteAddr));
memset(rbuf,0,1024);
int sByte = sendto(sock,rbuf,strlen(rbuf),0,(sockaddr*)&RemoteAddr,sizeof(RemoteAddr));
if(SOCKET_ERROR==sByte)
{
printf("sendto()Failed:%d\n",WSAGetLastError());
closesocket(sock);
WSACleanup();
return -1;
}
recvfrom(sock,name,1024,0,(sockaddr*)&RemoteAddr,&RemoteLen);
memset(rbuf,0,1024);
int rByte=recvfrom(sock,rbuf,1024,0,(sockaddr*)&RemoteAddr,&RemoteLen);
if(SOCKET_ERROR==rByte)
{
printf("recvfrom()Failed:%d\n",WSAGetLastError());
closesocket(sock);
WSACleanup();
return -1;
}
fwrite(rbuf,1,strlen(rbuf),fp);
fseek(fp,0,2);
printf("寫入的檔案內容為:\n %s\n",rbuf);
}
fclose(fp);
closesocket(sock);
WSACleanup();
return 0;
}
服務端代碼:
//服務端
#include<stdio.h>
#include<string.h>
#include<Winsock2.h>
#pragma comment(lib,"ws2_32.lib")
int main()
{
WSAData wsaData;
int err=WSAStartup(WINSOCK_VERSION,&wsaData);
if(0!=err)
{
return -1;
}
SOCKET sock;
sock=socket(AF_INET,SOCK_DGRAM,0);
if(INVALID_SOCKET==sock)
{
printf("socket()Failed:%d\n",WSAGetLastError());
WSACleanup();
return -1;
}
sockaddr_in LocalAddr;
LocalAddr.sin_family=AF_INET;
LocalAddr.sin_port=htons(20000);
LocalAddr.sin_addr.s_addr=htonl(INADDR_ANY);
err=bind(sock,(sockaddr*)&LocalAddr,sizeof(LocalAddr));
if(SOCKET_ERROR==err)
{
printf("bind()Failed:%d\n",WSAGetLastError());
closesocket(sock);
WSACleanup();
return -1;
}
sockaddr_in RemoteAddr;
int RemoteLen = sizeof(RemoteAddr);
char path[100]={"0"};
char name[100]={"0"};
while(1)
{
printf("請輸入檔案路徑\n");
gets(path);
FILE* fp=fopen(path,"rb"); // 讀寫二進制檔案 記得 加 b
if(!fp)
{
printf("error!");
return 1;
}
else
{
printf("檔案已經打開,等待傳輸...\n");
}
char rbuf[1024]={0};
while(1)
{
recvfrom(sock,name,1024,0,(sockaddr*)&RemoteAddr,&RemoteLen);
printf("檔案名字為:\n %s\n",name);
memset(rbuf,0,1024);
int rByte=recvfrom(sock,rbuf,1024,0,(sockaddr*)&RemoteAddr,&RemoteLen);
if(SOCKET_ERROR==rByte)
{
printf("recvfrom()Failed:%d\n",WSAGetLastError());
closesocket(sock);
WSACleanup();
return -1;
}
while(!feof(fp))
{
sendto(sock,path,strlen(path),0,(sockaddr*)&RemoteAddr,sizeof(RemoteAddr));
memset(rbuf,0,1024);
fread(rbuf,1,1024,fp);
int sByte=sendto(sock,rbuf,strlen(rbuf),0,(sockaddr*)&RemoteAddr,sizeof(RemoteAddr));
if(SOCKET_ERROR==sByte)
{
printf("sendto()Failed:%d\n",WSAGetLastError());
closesocket(sock);
WSACleanup();
return -1;
}
}
}
fclose(fp);
}
closesocket(sock);
WSACleanup();
return 0;
}
uj5u.com熱心網友回復:
any problem?uj5u.com熱心網友回復:
NO,no,NO,ojbk
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/61103.html
標籤:網絡通信
上一篇:Python全堆疊(十)Django框架之6.ORM模型基本使用
下一篇:信號與系統中關于沖激函式的問題
