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;
- int main(){
- /*-------------create UDP socket------------*/
- if((socketfd = socket(AF_INET,SOCK_DGRAM,)) == -){
- perror("socket error\n");
- exit();
- }
- /*-----------------IO-----------------------*/
- printf("Please input the ip:\n");
- scanf("%s",ip);
- printf("Please input the port:\n");
- scanf("%d",&port);
- /*-----------------bind----------------------*/
- bzero(&server,sizeof(server));
- server.sin_family = AF_INET;
- server.sin_port = htons(port);
- server.sin_addr.s_addr = inet_addr(ip);
- if (bind(socketfd,(struct sockaddr *)&server,sizeof(server)) == -){
- perror("bind error\n");
- exit();
- }
- /*---------------------调试信息------------
- addrlen = sizeof(client);
- recvfrom(socketfd,&recvbuf,sizeof(recvbuf),0,(struct sockaddr *)&client,&addrlen);
- num = strlen(recvbuf.buf);
- recvbuf.buf[num] = '\0';
- printf("command %d\n",recvbuf.command );
- printf("len %d\n",recvbuf.len );
- printf("no %d\n", recvbuf.no);
- printf("buf %s\n",recvbuf.buf ); */
- addrlen = sizeof(client);
- while(){
- bzero(&recvbuf,sizeof(recvbuf));
- num =recvfrom(socketfd,&recvbuf,sizeof(recvbuf),,(struct sockaddr *)&client,&addrlen);
- choice = recvbuf.command;
- if(choice == DOWNLOAD){
- char buf[];
- int fd;
- fd = open((recvbuf.buf),O_RDONLY);
- 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;
- 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));
- }
- }
- }
- else if(choice == UPLOAD){
- printf("The client want to upload the file: %s\n",recvbuf.buf);
- printf("Please choice start or no? \n");
- printf("5 :start, 4: no\n");
- scanf("%d",&sentbuf.command);
- sendto(socketfd,&sentbuf,sizeof(sentbuf),,(struct sockaddr *)&client,sizeof(client));
- if(sentbuf.command ==START){
- int no =;
- int fd =open(recvbuf.buf,O_CREAT | O_TRUNC |O_WRONLY,);
- if(fd < ){
- perror("create file error\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);
- printf("kkk%s\n",recvbuf.buf );
- bzero(&recvbuf,sizeof(recvbuf));
- }
- else{
- perror("The file no is not same.Some message is missed! error occured! \n");
- break;
- }
- }
- if(recvbuf.command == END){
- close(fd);
- printf("transmission is successful!\n");
- break;
- }
- }
- }
- else if(sentbuf.command == NO){
- printf("Not to trans the file\n");
- }
- else{
- perror("error! wrong choice!\n");
- exit();
- }
- }
- else if (recvbuf.command == SHUTDOWN){
- printf("Now the server is shutdown!\n");
- break;
- }
- }
- /*----------------------close ----------*/
- close(socketfd);
- return ;
- }
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传输)的更多相关文章
- 19、网络编程 (Socket套接字编程)
网络模型 *A:网络模型 TCP/IP协议中的四层分别是应用层.传输层.网络层和链路层,每层分别负责不同的通信功能,接下来针对这四层进行详细地讲解. 链路层:链路层是用于定义物理传输通道,通常是对某些 ...
- linux网络环境下socket套接字编程(UDP文件传输)
今天我们来介绍一下在linux网络环境下使用socket套接字实现两个进程下文件的上传,下载,和退出操作! 在socket套接字编程中,我们当然可以基于TCP的传输协议来进行传输,但是在文件的传输中, ...
- socket 套接字编程
今日内容 socket 套接字编程 简易服务端与客户端代码实现 通信循环 黏包现象(TCP协议) 报头制作.struct 模块.封装形式 内容详细 一.socket 套接字编程 实现一款能够进行数据交 ...
- day31 socket套接字编程
为什么要有套接字编程? 在上节课的学习中,我们学习了OSI七层协议,但是如果每次进行编程时我们都需要一层一层的将各种协议使用在我们的程序中,这样编写程序实在是太麻烦了,所以为了让程序的编写更加的简单, ...
- socket套接字编程 HTTP协议
socket套接字编程 套接字介绍 1. 套接字 : 实现网络编程进行数据传输的一种技术手段 2. Python实现套接字编程:import socket 3. 套接字分类 >流式套接 ...
- 19 网络编程--Socket 套接字方法
1.Socket(也称套接字)介绍 socket这个东东干的事情,就是帮你把tcp/ip协议层的各种数据封装啦.数据发送.接收等通过代码已经给你封装好了 ,你只需要调用几行代码,就可以给别的机器发消息 ...
- 网络编程--Socket(套接字)
网络编程 网络编程的目的就是指直接或间接地通过网络协议与其他计算机进行通讯.网络编程中 有两个主要的问题,一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后 如何可靠高效的进行数据传输.在 ...
- Linux之socket套接字编程20160704
介绍套接字之前,我们先看一下传输层的协议TCP与UDP: TCP协议与UDP协议的区别 首先咱们弄清楚,TCP协议和UCP协议与TCP/IP协议的联系,很多人犯糊涂了,一直都是说TCP/IP协议与UD ...
- Linux网络编程——原始套接字编程
原始套接字编程和之前的 UDP 编程差不多,无非就是创建一个套接字后,通过这个套接字接收数据或者发送数据.区别在于,原始套接字可以自行组装数据包(伪装本地 IP,本地 MAC),可以接收本机网卡上所有 ...
随机推荐
- DOM遍历方法
为标题行添加样式 $(document).ready(function(){ $('th').parent().addClass('table-heading'); $('tr:not([th]):o ...
- python 安装模块步骤
1.下载 pyocr-0.4.1.tar.gz tar.gz文件 解压 放到 c:/python27 文件夹下面 C:\Python27\pyocr-0.4.1 直接 cmd 命令 进入 ...
- Using Spring Boot without the parent POM
Using Spring Boot without the parent POM: 问题 spring boot项目一般情况下的parent如下: <parent> <groupId ...
- (转)js activexobject调用客户机exe文件
原文地址:http://blog.csdn.net/jiafugui/article/details/5364210 function Run(strPath) { try { var objShel ...
- javascript new
1. 仅function可以使用new 2. function使用new时,会拷贝function中this的内容给新对象,并将function的prototype指向新对象(如果该function没 ...
- 每周一荐:学习ACE一定要看的书
作 者:david++发布时间:2012/06/08 09:02文章地址:http://game-lab.org/?p=320 近两个月都在学习ACE,一个超级强大,也超级复杂的网络框架库.对ACE的 ...
- spring随手笔记3:销毁方法
1. public class HelloWorld { private String msg; public void setMsg(String msg) { this.msg = msg; } ...
- 第十二章 非对称加密算法-RSA
注意:本节内容主要参考自<Java加密与解密的艺术(第2版)>第8章“高等加密算法--非对称加密算法” 12.1.RSA(最经典的非对称加密算法) 特点: 使用一套密钥即可完成加解密(与D ...
- 源代码tfs to git
TFSàgit可以保留完整历史记录,方法: https://github.com/git-tfs/git-tfs 系统变量的path里加上: ;C:\Program Files (x86)\Git\b ...
- Android Studio插件推荐(PreIOC,GsonFormat)
好的插件能加快项目的开发速度,尤其是一些针对重复性的代码的插件,所以在这里向大家推荐2款不错的插件,如果以后发现新的好的插件,还会继续推荐,同时欢迎大家推荐 GsonFormat GsonFormat ...