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协议中的四层分别是应用 ...
随机推荐
- 实体类调用泛型父类中的静态方法中执行CRUD——第二版
using System; using System.Collections.Generic; using System.Data.Entity; using System.Linq; namespa ...
- HTML 图像<img>
定义和用法: img元素向网页中嵌入一副图像. 请注意:从技术上讲,<img>标签并不会在网页中插入图像,而是从网页上链接图像.<img>标签创建的是被引用图像的占位空间. 属 ...
- C++ 中 ZeroMemory、memset 危险需慎用
使用C/C++编程时,常使用ZeroMemory.memset或 “={0}”来对结构体对象进行初始化或清零.然而这三种方式都有各自的特点,使用时需谨慎,否则容易出现严重错误,本人今日解决一个导致宕机 ...
- Android doc打开太慢
C:\Windows\System32\drivers\etc\HOSTS 127.0.0.1 fonts.googleapis.com 127.0.0.1 www.google.com 127.0. ...
- Java 并发和多线程(一) Java并发性和多线程介绍[转]
作者:Jakob Jenkov 译者:Simon-SZ 校对:方腾飞 http://tutorials.jenkov.com/java-concurrency/index.html 在过去单CPU时 ...
- 为什么高手离不了Linux系统?这就是我的理由
摘要: 通过本文来记录下我在Linux系统的学习经历,聊聊我为什么离不了Linuxx系统,同时也为那些想要尝试Linux而又有所顾忌的用户答疑解惑,下面将为你介绍我所喜欢的Linux系统,这里有一些你 ...
- bzoj 2761: [JLOI2011]不重复数字
#include<cstdio> #include<iostream> #include<cstring> #include<algorithm> #d ...
- hidesBottombarWhenPushed的副作用
在UITabbarController包含的UINavigationController应用中,如果UINavigationController某一页(某个level)需要隐藏Tabbar,之前的做法 ...
- 网页首页制作总结(div+css+javascript)
一.对网页整体布局,分几个版块 如下图所示: 确定布局之后,规划好网页,准备素材,按照标准文档流的顺序,从上到下,从左到右写入代码. 以上图为例,分为两部分,红色的主体部分和页脚.主体部分分割为头部. ...
- 解决SSH会话连接超时问题
用SSH客户端连接linux服务器时,经常会出现与服务器会话连接中断现象,照成这个问题的原因便是SSH服务有自己独特的会话连接机制.记得在一年前就有朋友问过我这个问题,那时候我便是草草打发,结果自己现 ...