概述
UDP编程框图
UDP协议中服务器和客户端的交互存在于数据的收发过程中。
进行网络数据收发的时候,服务器和客户端的数据是对应的:客户端发送数据的动作,对服务器来说是接收数据的动作;客户端接收数据的动作,对服务器来说是发送数据的动作。
实现文件的传输大概分为这几个步骤:
- 客户端读文件,将内容放在client_buffer中
- 客户端通过sendto发送client_buffer中的数据
- 服务器端通过recvfrom对数据进行接收,存到server_buffer中
- 将数据写入文件中,关闭文件,关闭套接字
直接来代码:
服务器端:
// udp_file_server.c
#include <stdio.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <string.h>
#include <netinet/in.h>
#include <errno.h>
#include <memory.h>
#include <stdlib.h>
#define BUFFER_SIZE 1024
int main()
{
int sockfd,n;
struct sockaddr_in server,client;
int addrlen=sizeof(struct sockaddr);
char filename[100];
char filepath[100];
char *buffer;//file buffer
int fileTrans;
buffer = (char *)malloc(sizeof(char)*BUFFER_SIZE);
printf("init bufferSize=%d SIZE=%dn",sizeof(buffer),BUFFER_SIZE);
bzero(buffer,BUFFER_SIZE);
int lenfilepath;
FILE *fp;
int writelength;
if((sockfd = socket(AF_INET,SOCK_DGRAM,0))<0)
{
printf("socket build error!n");
}
else
{
printf("socket build success!n");
}
memset(&server,0,sizeof(server)); //清空server结构体
server.sin_family= AF_INET;
server.sin_addr.s_addr = htonl(INADDR_ANY);
server.sin_port = htons(8888);
if((bind(sockfd,(struct sockaddr*)&server,sizeof(server)))==-1)
{
printf("bind error!n");
}
else
{
printf("bind success!n");
}
while(1)
{
printf("waiting....n");
memset(filename,'