一、接收端
//申请套接字
int sockfd = socket(AF_INET,SOCK_DGRAM,0);
if(sockfd<0)
{
perror("socket fail");
return -1;
}
设置复用端口
//设置端口复用
int op = 1;
int opt = setsockopt(sockfd, SOL_SOCKET, SO_REUSEPORT, &op, sizeof(op));
if(opt < 0)
{
perror("setsockopt fail");
return -1;
}
3、绑定
//绑定
struct sockaddr_in saddr;
memset(&saddr,0,sizeof(saddr));
saddr.sin_family = AF_INET;
saddr.sin_port = htons(8888);
saddr.sin_addr.s_addr = htonl(INADDR_ANY);
int ret = bind(sockfd,(struct sockaddr*)&saddr,sizeof(saddr));
char recvbuf[1024]={0};
struct sockaddr_in recvaddr;
socklen_t len = sizeof(recvaddr);
//接收连接问候语
size_t size = recvfrom(sockfd,recvbuf,sizeof(recvbuf),0,(struct sockaddr*)&recvaddr,&len);
if(size<0)
{
perror("recvfrom fail");
return -1;
}
printf("%s",recvbuf);
//接收文件信息
int filesize = 0;
char filename[256]={0};
recvfrom(sockfd,recvbuf,sizeof(recvbuf),0,(struct sockaddr*)&recvaddr,&len);
//接收文件大小
memcpy(&filesize,recvbuf,sizeof(int));
//获取文件名
memcpy(filename,recvbuf+4,strlen(recvbuf)-4);
//获取文件数据内容大小
char filedatasize[1024]={0};
ret = recvfrom(sockfd,filedatasize,sizeof(filedatasize),0,(struct sockaddr*)&recvaddr,&len);
if(ret < 0)
{
perror("recv filedatasize fail");
return -1;
}
//新建文件
if(createNewfile(filename,filesize,filedatasize))
{
printf("接收完成\n");
}
close(sockfd);
return 0;
}
bool createNewfile(const char*filenames,int filesize,const char* filedata)
{
FILE* fp = 0;
char filename[1024]="./demo.c";
fp = fopen(filename,"w+");
if(fp == 0)
{
perror("fp open fail");
return false;
}
fseek(fp,filesize,0);
rewind(fp);
//写文件
size_t ret = fwrite(filedata,strlen(filedata),1,fp);
if(ret < 0)
{
perror(" write new file fail");
return false;
}
return true;
}
二、发送端
/*************************************************************************
> File Name: udp_send.c
> Author: joe
> Mail: 1187108941@qq.com
> Created Time: Tue Feb 18 12:12:04 2020
************************************************************************/
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
int main(int argc,char** argv) {
//申请套接字
int sockfd = socket(AF_INET,SOCK_DGRAM,0);
if(sockfd<0)
{
perror("socket fail");
return -1;
}
//绑定
struct sockaddr_in saddr;
memset(&saddr,0,sizeof(saddr));
saddr.sin_family = AF_INET;
saddr.sin_port = htons(8888);
saddr.sin_addr.s_addr = inet_addr("192.168.2.101");
char hellobuf[128]="hello i am joe";
size_t size = sendto(sockfd,hellobuf,strlen(hellobuf),0,(struct sockaddr*)&saddr,sizeof(saddr));
if(size<0)
{
perror("sendto fail");
return -1;
}
//开始发送文件,读取文件
char filedata[1024]={0};
char filepath[1024]={0};
scanf("%s",filepath);
//打开文件
FILE *fp = 0;
fp = fopen(filepath,"r");
if(fp ==0)
{
perror("open fail");
return -1;
}
fread(filedata,sizeof(filedata),1,fp);
fseek(fp,0,2);
int filesize = ftell(fp);
char filemsg[1024]={0};
memcpy(filemsg,&filesize,4);
memcpy(filemsg+4,filepath,strlen(filepath));
//发送
size = sendto(sockfd,filemsg,strlen(filemsg),0,(struct sockaddr*)&saddr,sizeof(saddr));
if(size<0)
{
perror("send filemsg fail");
return -1;
}
//发送文件内容
size = sendto(sockfd,filedata,strlen(filedata),0,(struct sockaddr*)&saddr,sizeof(saddr));
if(size<0)
{
perror("send filemsg fail");
return -1;
}
close(sockfd);
return 0;
}