导读

如果想要自己写一个服务器和客户端,我们需要掌握一定的网络编程技术,个人认为,网络编程中最关键的就是这个东西——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通信相关推荐

  1. Linux下利用ssh远程文件传输 传输命令 scp

    在linux下一般用scp这个命令来通过ssh传输文件. 一.scp是什么? scp是secure copy的简写,用于在Linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进 ...

  2. Linux下Docker安装微信文件传输问题

    Docker安装wechat参考博客: Docker安装微信 - 简书Docker安装微信 1.概述 通过安装docker,结合docker GUI在docker上添加wechat容器来实现运行wec ...

  3. Linux下C语言实现TCP文件传输

    开发环境: Linux,GCC 功能介绍: 客户端和服务端的TCP文件传输,客户端可以上传文件到服务端,也可以从服务端下载文件,还可以查看和修改服务端的工作目录(临时),查看客户端当前目录. 代码下载 ...

  4. c tcp服务器发送文件,c语言tcp文件传输

    c语言tcp文件传输 内容精选 换一换 第18节Linux网络管理入门本节所讲内容:18.1OSI七层模型和TCP/IP四层模型18.1.1OSI七层模型OSI七层模型是任何与网络相关的知识都无法跳过 ...

  5. 基于TCP的大文件传输c语言项目

    文章目录 前言:功能实现 tcp文件传输的基本过程: 1.用户登录 1.1创建数据库 2.文件普通下载和上传的实现: 2.1 普通下载 2.2 普通上传 2.3 文件秒上传的实现 2.断点下载和断点上 ...

  6. Linux下的图标与文件关联机制:freedesktop

    Linux下的图标与文件关联机制:freedesktop 目前主流的Linux发行版中,使用的桌面基本都是基于GNOME.KDE.Xfce等环境,这几种桌面环境中,关于桌面图标,文件关联,应用程序启动 ...

  7. linux查看mysql连接日志文件,linux下查看mysql日志文件的方法

    查看mysql日志方法: mysql默认不允许我们查看日志.需要更改一些设置 1 vi 更改配置文件 允许用户查看日志文件 sudo vi /etc/mysql/mysql.conf.d/mysqld ...

  8. 如何在linux下用rsync同步文件以及它的用法和scp的用法

    如何在linux下用rsync同步文件以及它的用法和scp的用法 2010年06月06日 root@legend-laptop:/home/legend/httpd~/cgi-bin# rsync - ...

  9. linux间服务器间文件传输,Linux命令scp服务器间文件传输教程

    scp就是secure copy,是用来进行远程文件拷贝的.数据传输使用 ssh,并且和ssh 使用相同的认证方式,提供相同的安全保证 .那么你知道Linux命令scp服务器间文件传输教程么?接下来是 ...

最新文章

  1. 程序员如何选择适合的公司
  2. tem在c语言中的作用,Temtem状态有什么效果 Temtem各状态效果介绍_游侠网
  3. MyBatis mapper代理方式
  4. centos解压zip命令_Linux日常运维(5)—常用压缩包解压命令整理
  5. 20165223《Java程序设计》第八周Java学习总结
  6. mmdnn TensorFlow is outdated
  7. java计数器策略模式_java设计模式(二十一)--策略模式
  8. c++ 单引号和双引号
  9. c++循环读取多行文本文件
  10. 电商垄断的形式不是对某一行业的具体垄断
  11. 折线图笔记 -python
  12. PHP合并2个数字键数组的值
  13. 卡通动漫漫画微信小程序源码开源版
  14. 华中农大计算机排名,华中农业大学专业排名,招生专业目录(10篇)
  15. 2020光学期刊一区二区影响因子发布(科睿唯安)
  16. 利用Jscript实现淘宝购物车的全选框功能
  17. Spring In Action 学习 第一章 Spring之旅
  18. 计算机速成课 第三十七集 机器人
  19. 计算机清理方法,电脑清理方法 电脑要如何清理
  20. LUEVELSMEYER的PE文件格式

热门文章

  1. 5.7 echo:显示一行文本
  2. opencv 图像 抠图 算法_人工智能 | 不用绿幕也能实时抠图,商汤等提出只需单张图像、单个模型的新方法MODNet...
  3. zabbix的安装与部署(proxy、睿象云)
  4. 小a与204(牛客寒假算法集训营1题目B)
  5. 应云而生,幽灵的威胁 - 云原生应用交付与运维
  6. 技术有温,代码有爱——1024技术公益信息无障碍
  7. 如何在不同摄像头里识别行人?多层相似度感知CNN网络解析
  8. ubuntu虚拟机卡住开机_虚拟机Ubuntu开机问题及解决方法
  9. 移动游戏市场爆发背后的游戏引擎战局
  10. J2ME手游开发日记