linux网络环境下socket套接字编程(UDP文件传输)

时间:2021-09-30 02:23:52

今天我们来介绍一下在linux网络环境下使用socket套接字实现两个进程下文件的上传,下载,和退出操作!

在socket套接字编程中,我们当然可以基于TCP的传输协议来进行传输,但是在文件的传输中,如果我们使用TCP传输,会造成传输速度较慢的情况,所以我们在进行文件传输的过程中,最好要使用UDP传输。

在其中,我们需要写两个程序,一个客户端,一个服务端,在一个终端中,先运行服务端,在运行客户端,在服务端和客户端都输入IP地址和端口号,注意服务端和客户端的端口号要相同,然后选择功能,在linux网络编程中,使用UDP进行传输属于比较简单的操作,所以直接上代码吧,详细的讲解我将会在之后上传!

client(客户端):

     #include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <fcntl.h>
#include <sys/stat.h>
#include "protocol.h" /*--------------------------*/
int socketfd ;
int addrlen;
struct sockaddr_in server;
struct protocol sentbuf;
struct protocol recvbuf;
int num;
char ip[];
int port;
int choice ;
char filename[]; /*--------------------------*/
void ShowMenu();
void DownLoad();
void UpLoad();
void ShutDown(); int main(){
/*---------------------------*/
socketfd = socket(AF_INET , SOCK_DGRAM , );
if(socketfd == -){
perror("socket failed!\n");
exit();
}
/*---------------------------*/
printf("please input ip of server:\n");
scanf("%s",ip);
printf("please input port of server:\n");
scanf("%d",&port);
/*---------------------------*/
bzero(&server , sizeof(server));
server.sin_family = AF_INET;
server.sin_port = htons(port);
server.sin_addr.s_addr = inet_addr(ip);
addrlen = sizeof(server);
/*---------------------------*/
while(){
ShowMenu();
scanf("%d",&choice);
if(choice == DOWNLOAD){
printf("client download!\n");
DownLoad();
}
else if(choice == UPLOAD){
UpLoad();
}
else if(choice == SHUTDOWN){
printf("client shutdown!\n");
ShutDown();
break;
}
else{
printf("please input the right choice!\n");
}
}
close(socketfd);
return ;
} void ShowMenu(){
printf("please make a choice:\n");
printf("0:shutdown!\n");
printf("1:download!\n");
printf("2:upload!\n");
} void DownLoad(){
bzero(&recvbuf , sizeof(recvbuf));
bzero(&sentbuf , sizeof(sentbuf));
bzero(filename , sizeof(filename));
printf("please input the filename:\n");
scanf("%s",sentbuf.buf);
sentbuf.command = DOWNLOAD;
sendto(socketfd , &sentbuf , sizeof(sentbuf), , (struct sockaddr*)&server , sizeof(server));
bcopy(sentbuf.buf , filename , sizeof(sentbuf.buf));
recvfrom(socketfd , &recvbuf , sizeof(recvbuf) , , (struct sockaddr*)&server , &addrlen);
printf("recvbuf:%d\n",recvbuf.command);
if(recvbuf.command == YES){
printf("YES!\n");
int choice_1;
printf("if you input a 5 , the file transmission start!\n");
scanf("%d",&choice_1);
if(choice_1 == START){
sentbuf.command = START;
sendto(socketfd , &sentbuf , sizeof(sentbuf) , , (struct sockaddr*)&server , sizeof(server));
int no = ;
int fd = open(filename , O_CREAT | O_TRUNC | O_WRONLY , );
if(fd < ){
perror("creat file is failed!\n");
exit();
}
bzero(&recvbuf , sizeof(recvbuf));
while( ( num = recvfrom(socketfd , &recvbuf , sizeof(recvbuf) , , (struct sockaddr*)&server , &addrlen)) > ){
if( recvbuf.command == CONTENT ){
if(no == recvbuf.no){
write(fd , recvbuf.buf , recvbuf.len);
bzero(&recvbuf , sizeof(recvbuf));
}
else{
perror("The file no is not same, Some massage is missed!error occured!\n");
break;
}
}
if( recvbuf.command == END){
close(fd);
printf("transmission is successful!\n");
break;
}
}
}
}
else if(recvbuf.command == NO){
perror("No such file on server!\n");
}
else{
perror("recvbuf.command error!\n");
exit();
}
} void ShutDown(){
sentbuf.command = SHUTDOWN;
sendto(socketfd , &sentbuf , sizeof(sentbuf) , , (struct sockaddr*)&server , sizeof(server));
printf("client is end!\n");
} void UpLoad(){
bzero(&recvbuf , sizeof(recvbuf));
bzero(&sentbuf , sizeof(sentbuf));
bzero(filename , sizeof(filename));
printf("please input you want to upload filename:\n");
scanf("%s",sentbuf.buf);
sentbuf.command = UPLOAD;
sendto(socketfd , &sentbuf , sizeof(sentbuf), , (struct sockaddr*)&server , sizeof(server));
bcopy(sentbuf.buf , filename , sizeof(sentbuf.buf));
int fd ;
fd = open(filename , O_RDONLY);
if(fd < ){
perror("The file is not exist!\n");
exit();
}
recvfrom(socketfd , &recvbuf , sizeof(recvbuf), , (struct sockaddr*)&server , &addrlen);
if( recvbuf.command == START ){
int no = ;
while( ( num = read(fd , sentbuf.buf , INFOLEN)) > ){
sentbuf.no = no ;
sentbuf.command = CONTENT;
sentbuf.len = strlen(sentbuf.buf);
sendto(socketfd , &sentbuf , sizeof(sentbuf) , , (struct sockaddr*)&server,sizeof(server));
no++;
bzero(&sentbuf , sizeof(sentbuf));
}
bzero(&sentbuf , sizeof(sentbuf));
sentbuf.command = END;
sendto(socketfd , &sentbuf , sizeof(sentbuf) , , (struct sockaddr*)&server , sizeof(server));
}
else if(recvbuf.command == NO){
printf("not transmission!\n");
}
else{
perror("error! wrong choice!\n");
}
}

server(服务端):

 #include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <fcntl.h>
#include <sys/stat.h>
#include "protocol.h" int socketfd;
int addrlen;
struct sockaddr_in server;
struct sockaddr_in client;
struct protocol sentbuf;
struct protocol recvbuf;
int num;
char ip[];
int port;
int choice;
char filename[]; void DownLoad();
void ShutDown();
void UpLoad(); int main(){
socketfd = socket( AF_INET , SOCK_DGRAM , );
if( socketfd == -){
perror("socket failed!\n");
exit();
} printf("please input client ip:\n");
scanf("%s" , ip);
printf("please input client port:\n");
scanf("%d",&port); bzero(&server , sizeof(server));
server.sin_family = AF_INET;
server.sin_port = htons(port);
server.sin_addr.s_addr = inet_addr(ip); int bin = bind(socketfd , (struct sockaddr*)&server , sizeof(server));
if(bin == -){
perror("bind failed!\n");
exit();
} addrlen = sizeof(client);
//char filename[100]; while(){
bzero(&recvbuf , sizeof(recvbuf));
num = recvfrom(socketfd , &recvbuf , sizeof(recvbuf) , , (struct sockaddr*)&client , &addrlen);
choice = recvbuf.command;
bcopy(recvbuf.buf ,filename, sizeof(recvbuf.buf));
printf("%s\n",filename);
if(choice == DOWNLOAD){
printf("kkkkkkkk\n");
DownLoad();
}
else if(choice == SHUTDOWN){
printf("server will shutdown!\n");
ShutDown();
break;
}
else if(choice == UPLOAD){
UpLoad();
}
}
return ;
} void DownLoad(){
char buf[];
int fd ;
printf("11111\n");
printf("%s\n",filename);
fd = open((filename) , O_RDONLY);
printf("fd:%d\n",fd);
bzero(&sentbuf , sizeof(sentbuf));
if(fd < ){
sentbuf.command = NO;
sendto(socketfd , &sentbuf , sizeof(sentbuf) , , (struct sockaddr*)&client , sizeof(client));
printf("no such file!\n");
exit();
}
else{
sentbuf.command = YES;
printf("YES!\n");
sendto(socketfd , &sentbuf, sizeof(sentbuf) , , (struct sockaddr*)&client , sizeof(client));
recvfrom(socketfd , &recvbuf , sizeof(recvbuf) , , (struct sockaddr*)&client , &addrlen);
if(recvbuf.command == START){
int no = ;
while((num = read(fd , sentbuf.buf , INFOLEN)) > ){
sentbuf.no = no ;
sentbuf.command = CONTENT;
sentbuf.len = strlen(sentbuf.buf);
sendto(socketfd , &sentbuf , sizeof(sentbuf),,(struct sockaddr*)&client , sizeof(client));
no++;
bzero(&sentbuf , sizeof(sentbuf));
}
bzero(&sentbuf , sizeof(sentbuf));
sentbuf.command = END;
sendto(socketfd , &sentbuf , sizeof(sentbuf) , , (struct sockaddr*)&client , sizeof(client));
}
}
} void ShutDown(){
printf("Now server is shutdown!\n");
} void UpLoad(){
//bzero(&recvbuf , sizeof(recvbuf));
bzero(&sentbuf , sizeof(sentbuf));
bzero(&filename , sizeof(filename));
//recvfrom(socketfd , &recvbuf , sizeof(recvbuf) , 0 , (struct sockaddr*)&client , &addrlen);
printf("4:NO 5:START\n");
scanf("%d" , &sentbuf.command);
sendto(socketfd , &sentbuf , sizeof(sentbuf) , , (struct sockaddr*)&client , sizeof(client));
if( sentbuf.command == START){
int no = ;
printf("filename:%s\n",recvbuf.buf);
int fd = open(recvbuf.buf , O_CREAT | O_TRUNC | O_WRONLY , );
if(fd < ){
perror("create file failed!\n");
exit();
}
bzero(&recvbuf , sizeof(recvbuf) );
while(( num = recvfrom(socketfd , &recvbuf , sizeof(recvbuf) , , (struct sockaddr*)&client , &addrlen)) > ){
if( recvbuf.command == CONTENT ){
if( no == recvbuf.no ){
write(fd , recvbuf.buf , recvbuf.len);
bzero(&recvbuf , sizeof(recvbuf));
}
else{
perror("The file no is not same . Some massage is missed!\n");
break;
}
}
if( recvbuf.command == END ){
close(fd);
printf("transmission is successful!\n");
break;
}
}
}
else if( sentbuf.command == NO ){
printf("The file can't transmission!\n");
}
else{
perror("please input right choice!\n");
exit();
}
}

makefile:

main:udpserver.o udpclient.o
gcc -o udpserver udpserver.o
gcc -o udpclient udpclient.o
udpserver.o:udpserver.c
gcc -c udpserver.c
udpclient.o:udpclient.c
gcc -c udpclient.c