linux下c语言tcp文件传输,C语言实现TCP通信
导读
如果想要自己写一个服务器和客户端,我们需要掌握一定的网络编程技术,个人认为,网络编程中最关键的就是这个东西——socket(套接字)。socket(套接字):简单来讲,socket就是用于描述IP地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的通信。
TCP协议
TCP协议:是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能。
关键词:三次握手,可靠,基于字节流。
可能有朋友会问,TCP就这么简单一句话吗?当然不是,TCP作为非常重要的传输协议,细节知识是很多的,细讲起来这一篇文章怕是不够。不过在本篇内容中,我们只需了解他的几个关键词特性,就能很好的理解下面的内容。
TCP服务器端和客户端的运行流程
如图,这是一个完整的TCP服务器——客户端的运行流程图,其实我个人认为程序啊,不管哪个语言都是一样,核心就在于算法的设计和函数的调用。那么图中的函数都是什么意思呢?
1.创建socket
socket是一个结构体,被创建在内核中
sockfd=socket(AF_INET,SOCK_STREAM,0); //AF_INT:ipv4, SOCK_STREAM:tcp协议
2.调用bind函数
将socket和地址(包括ip、port)绑定。
需要定义一个结构体地址,以便于将port的主机字节序转化成网络字节序
struct sockaddr_in myaddr; //地址结构体
bind函数
bind(sockfd,(struct sockaddr*)&myaddr,sizeof(serveraddr))
3.listen监听,将接收到的客户端连接放入队列
listen(sockfd,8) //第二个参数是队列长度
4.调用accept函数,从队列获取请求,返回socket描 述符
如果无请求,将会阻塞,直到获得连接
int fd=accept(sockfd, NULL,NULL);//这边采用默认参数
5.调用read/write进行双向通信
6.关闭accept返回的socket
close(scokfd);
下面放出完整代码
/*服务器*/
#include
#include
#include
#include
#include
#include
#include
#include
int main()
{
int sockfd = socket(AF_INET, SOCK_STREAM, 0);//创建套接字
if (sockfd < 0) { perror("socket"); return -1; } //创建失败的错误处理 printf("socket..............\n"); //成功则打印“socket。。。。” struct sockaddr_in myaddr; //创建“我的地址”结构体 memset(&myaddr, 0, sizeof(myaddr)); //对内存清零(保险起见) myaddr.sin_family = AF_INET; //选择IPV4地址类型 myaddr.sin_port = htons(8888); //选择端口号 myaddr.sin_addr.s_addr = inet_addr("192.168.3.169"); //选择IP地址 if (0 > bind(sockfd, (struct sockaddr*)&myaddr, sizeof(myaddr)))//绑定套接字
{
perror("bind");
return -1;
}
printf("bind..........\n");
if (0 > listen(sockfd, 8))//调用listen对指定端口进行监听
{
perror("listen");
return -1;
}
printf("listen............\n");
int connfd = accept(sockfd, NULL, NULL);//使用accept从消息队列中获取请求
if (connfd < 0) { perror("accept"); return -1; } printf("accept..............\n"); char buf[100];//定义一个数组用来存储接收到的数据 int ret; while (1) { memset(buf, 0, sizeof(buf)); ret = read(connfd, buf, sizeof(buf)); if (0 > ret)
{
perror("read");
break;
}//执行while循环读取数据,当
else if (0 == ret)
{
printf("write close!\n");
break;
}
printf("recv: ");
fputs(buf, stdout);//打印接收到的数据
}
close(sockfd);//关闭套接字
close(connfd);//断开连接
return 0;
}
/*客户端*/(具体功能和服务器一样,所以不再加注释)
#include
#include
#include
#include
#include
#include
#include
#include
int main()
{
int sockfd;
if (0 > (sockfd = socket(AF_INET, SOCK_STREAM, 0)))
{
perror("socket");
return -1;
}
printf("socket...........\n");
struct sockaddr_in srv_addr;
memset(&srv_addr, 0, sizeof(srv_addr));
srv_addr.sin_family = AF_INET;
srv_addr.sin_port = htons(8888);
srv_addr.sin_addr.s_addr = inet_addr("192.168.3.169");
if (0 > connect(sockfd, (struct sockaddr*)&srv_addr, sizeof(srv_addr)))
{
perror("connect");
return -1; //exit //pthread_exit
}
printf("connect..............\n");
char buf[100];
int ret;
while (1)
{
printf("send: ");
fgets(buf, sizeof(buf), stdin);
ret = write(sockfd, buf, sizeof(buf));
if (ret < 0)
{
perror("write");
break;
}
if (strncmp(buf, "quit", 4) == 0)
break;
}
close(sockfd);
return 0;
}
linux下c语言tcp文件传输,C语言实现TCP通信相关推荐
- Linux下利用ssh远程文件传输 传输命令 scp
在linux下一般用scp这个命令来通过ssh传输文件. 一.scp是什么? scp是secure copy的简写,用于在Linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进 ...
- Linux下Docker安装微信文件传输问题
Docker安装wechat参考博客: Docker安装微信 - 简书Docker安装微信 1.概述 通过安装docker,结合docker GUI在docker上添加wechat容器来实现运行wec ...
- Linux下C语言实现TCP文件传输
开发环境: Linux,GCC 功能介绍: 客户端和服务端的TCP文件传输,客户端可以上传文件到服务端,也可以从服务端下载文件,还可以查看和修改服务端的工作目录(临时),查看客户端当前目录. 代码下载 ...
- c tcp服务器发送文件,c语言tcp文件传输
c语言tcp文件传输 内容精选 换一换 第18节Linux网络管理入门本节所讲内容:18.1OSI七层模型和TCP/IP四层模型18.1.1OSI七层模型OSI七层模型是任何与网络相关的知识都无法跳过 ...
- 基于TCP的大文件传输c语言项目
文章目录 前言:功能实现 tcp文件传输的基本过程: 1.用户登录 1.1创建数据库 2.文件普通下载和上传的实现: 2.1 普通下载 2.2 普通上传 2.3 文件秒上传的实现 2.断点下载和断点上 ...
- Linux下的图标与文件关联机制:freedesktop
Linux下的图标与文件关联机制:freedesktop 目前主流的Linux发行版中,使用的桌面基本都是基于GNOME.KDE.Xfce等环境,这几种桌面环境中,关于桌面图标,文件关联,应用程序启动 ...
- linux查看mysql连接日志文件,linux下查看mysql日志文件的方法
查看mysql日志方法: mysql默认不允许我们查看日志.需要更改一些设置 1 vi 更改配置文件 允许用户查看日志文件 sudo vi /etc/mysql/mysql.conf.d/mysqld ...
- 如何在linux下用rsync同步文件以及它的用法和scp的用法
如何在linux下用rsync同步文件以及它的用法和scp的用法 2010年06月06日 root@legend-laptop:/home/legend/httpd~/cgi-bin# rsync - ...
- linux间服务器间文件传输,Linux命令scp服务器间文件传输教程
scp就是secure copy,是用来进行远程文件拷贝的.数据传输使用 ssh,并且和ssh 使用相同的认证方式,提供相同的安全保证 .那么你知道Linux命令scp服务器间文件传输教程么?接下来是 ...
最新文章
- 程序员如何选择适合的公司
- tem在c语言中的作用,Temtem状态有什么效果 Temtem各状态效果介绍_游侠网
- MyBatis mapper代理方式
- centos解压zip命令_Linux日常运维(5)—常用压缩包解压命令整理
- 20165223《Java程序设计》第八周Java学习总结
- mmdnn TensorFlow is outdated
- java计数器策略模式_java设计模式(二十一)--策略模式
- c++ 单引号和双引号
- c++循环读取多行文本文件
- 电商垄断的形式不是对某一行业的具体垄断
- 折线图笔记 -python
- PHP合并2个数字键数组的值
- 卡通动漫漫画微信小程序源码开源版
- 华中农大计算机排名,华中农业大学专业排名,招生专业目录(10篇)
- 2020光学期刊一区二区影响因子发布(科睿唯安)
- 利用Jscript实现淘宝购物车的全选框功能
- Spring In Action 学习 第一章 Spring之旅
- 计算机速成课 第三十七集 机器人
- 计算机清理方法,电脑清理方法 电脑要如何清理
- LUEVELSMEYER的PE文件格式
热门文章
- 5.7 echo:显示一行文本
- opencv 图像 抠图 算法_人工智能 | 不用绿幕也能实时抠图,商汤等提出只需单张图像、单个模型的新方法MODNet...
- zabbix的安装与部署(proxy、睿象云)
- 小a与204(牛客寒假算法集训营1题目B)
- 应云而生,幽灵的威胁 - 云原生应用交付与运维
- 技术有温,代码有爱——1024技术公益信息无障碍
- 如何在不同摄像头里识别行人?多层相似度感知CNN网络解析
- ubuntu虚拟机卡住开机_虚拟机Ubuntu开机问题及解决方法
- 移动游戏市场爆发背后的游戏引擎战局
- J2ME手游开发日记