linux网络环境下socket套接字编程(UDP文件传输)
今天我们来介绍一下在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
linux网络环境下socket套接字编程(UDP文件传输)的更多相关文章
- linux网络编程-(socket套接字编程UDP传输)
今天我们来介绍一下在linux网络环境下使用socket套接字实现两个进程下文件的上传,下载,和退出操作! 在socket套接字编程中,我们当然可以基于TCP的传输协议来进行传输,但是在文件的传输中, ...
- [网络编程之Socket套接字介绍,套接字工作流程,基于TCP协议的套接字程序]
[网络编程之Socket套接字介绍,套接字工作流程,基于TCP协议的套接字程序] 为何学习socket套接字一定要先学习互联网协议: 1.首先:要想开发一款自己的C/S架构软件,就必须掌握socket ...
- socket套接字编程 HTTP协议
socket套接字编程 套接字介绍 1. 套接字 : 实现网络编程进行数据传输的一种技术手段 2. Python实现套接字编程:import socket 3. 套接字分类 >流式套接 ...
- socket 套接字编程
今日内容 socket 套接字编程 简易服务端与客户端代码实现 通信循环 黏包现象(TCP协议) 报头制作.struct 模块.封装形式 内容详细 一.socket 套接字编程 实现一款能够进行数据交 ...
- Linux之socket套接字编程20160704
介绍套接字之前,我们先看一下传输层的协议TCP与UDP: TCP协议与UDP协议的区别 首先咱们弄清楚,TCP协议和UCP协议与TCP/IP协议的联系,很多人犯糊涂了,一直都是说TCP/IP协议与UD ...
- 网络编程之socket套接字
目录 socket套接字简介 socket模块 通信循环 代码优化 连接循环 半连接池 黏包问题 解决黏包问题 黏包问题特殊情况(文件过大) socket套接字简介 由于操作OSI七层是所有C/S架构 ...
- java 25 - 3 网络编程之 Socket套接字
Socket Socket套接字: 网络上具有唯一标识的IP地址和端口号组合在一起才能构成唯一能识别的标识符套接字. Socket原理机制: 通信的两端都有Socket. 网络通信其实就是Socket ...
- 19、网络编程 (Socket套接字编程)
网络模型 *A:网络模型 TCP/IP协议中的四层分别是应用层.传输层.网络层和链路层,每层分别负责不同的通信功能,接下来针对这四层进行详细地讲解. 链路层:链路层是用于定义物理传输通道,通常是对某些 ...
- 31_网络编程(Socket套接字编程)_讲义
今日内容介绍 1.网络三要素及传输协议 2.实现UDP协议的发送端和接收端 3.实现TCP协议的客户端和服务器 4.TCP上传文件案例 01网络模型 *A:网络模型 TCP/IP协议中的四层分别是应用 ...
随机推荐
- android 5.0 水波纹 实现
1. 定义一个普通圆角背景的xml; rounded_corners.xml <?xml version="1.0" encoding="utf-8"?& ...
- js 原生对象排序
//对象属性排序 function compare(propertyName) { return function (object1, object2) { var value1 = object1[ ...
- C++中 接口的定义 COM
首先定义一个虚基类的接口,其中包含虚函数AddRef Release QueryInterface,(MFC 类IUnKnown unknwn.h)分别是增加减去引用计数和查询接口然后定义一个实现类, ...
- 樱花漫地集于我心,蝶舞纷飞祈愿相随 発生:genesis 发生:genesis
朱念齐,学号160809404(这些其实并没有什么乱用)唉( ̄y▽ ̄)~* 正文 鬼族后裔,原是露格尼卡王国的子民,在王立比布利亚学园任职魔法使拥有分别为: 拥有书库: 书库:傲慢(Superbia) ...
- 【转】Ant学习笔记——自己构建Ant编译环境
自从年初开始用NetBeans6.0,才接触到Ant. 这是今年6月份的一篇Ant学习笔记.安装 1.下载并构建环境. 去官网下载src包和bin包.解压缩它们到同一目录,运行build.bat, ...
- Invalid byte 3 of 3-byte UTF-8 sequence
用maven编译,tomcat启动时报错:IOException parsing XML document from class path resource [applicationContext.x ...
- 微信公众平台开发接口PHP SDK完整版(转载)
<?php/* 方倍工作室 http://www.fangbei.org/ CopyRight 2015 All Rights Reserved*/ define("TOK ...
- 第1章 Express MongoDB 搭建多人博客
学习环境 Node.js : 0.10.22 + Express : 3.4.4 + MongoDB : 2.4.8 + 快速开始 安装 Express express 是 Node.js 上最流行的 ...
- Jmeter—5 关联 响应数据传递-正则表达式提取器
在测试过程中,遇到一个问题:用户登录成功后服务器会返回一个登录凭证,之后所有的操作都需要带上此凭证.我们怎么获取登录凭证并传递给后续的操作? Jmeter提供了正则表达式提取器,用变量提取参数,后续通 ...
- Spark随笔(二):深入学习
一.如何选择粗粒度和细粒度 从底层往上引申来理解粗粒度与细粒度. 一层:一个类,具有三个属性值.为了查询这个类的所有实例,细粒度查询的程度为属性值,即依次查询每个实例化对象的属性值,查询三次:粗粒度按 ...