linux网络编程之TCP协议编程

Linux网络编程之TCP协议编程

  • tcp协议编程模型
    • socket函数
    • sockaddr_in
    • bind
    • listen
    • connect
  • 应用
    • 服务端代码
    • 客服端代码

TCP协议编程)

tcp协议编程模型

Server
1.创建socket
(socket函数)
2.确定服务器协议地址簇
(struct sockaddr)
3.绑定
(bind)
4.监听
( listen)
5.接受客户端连接
(accept)
6.通信
(recv send)
7.断开连接
(close)

Client
1.创建socket
2.获取服务器地址簇
3.连接服务器
4.通信
5.断开连接

socket函数

在这里插入图片描述

socket(int demain, int type, int protocol)

//demain    表示协议类型:网络协议一般用 (AF_INET)
//type  表示媒介类型:tcp协议一般数据流是SOCK_STREAM
//protocol  表示保护方式,这个写默认的就行

/*函数的返回值:返回一个网络的描述符号,类似文件描述符号,一般翻译为套接字,是网络设备的映射
操作套接字就是在操作对应的网络设备

返回-1代表失败,返回0表示成功
*/

这是协议的类型
在这里插入图片描述

sockaddr_in

确定服务器地址簇,确定IP地址,端口那些
可以用sockaddr结构体或者用sockaddr_in这个结构体
不过,一般推荐使用sockaddr_in这个结构体

这里讲解下sockaddr_in这个结构体的部分成员
1.sin_family (与socket函数的第一个函数一致)

2.sin_addr.s_addr (IP地址)
你可以填实际的,也可以直接用面向参数去操作
用面向操作的时候,要用inet_addr()把字符串类型转化成整数

3.sin_port //端口号
要用htons函数将小端转化成大端
用atoi函数将字符串类型转化成整形

bind

在这里插入图片描述

这里有三个参数
int bind(int sockfd, const struct sockaddr *addr,
socklen_t addrlen);

第一个直接填创建的服务器
第二个参数如果你使用sockaddr_in这个结构体的话,要进行类型的转化,
第三个参数就是第二个参数的大小(可用sizeof计算)

listen

在这里插入图片描述

connect

在这里插入图片描述

应用

服务端代码

服务端代码

#include <stdio.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <signal.h>
#include <arpa/inet.h>
int serverFd;
int clientSocket;
void hand(){
	close(serverFd);
	close(clientSocket);
	exit(0);
}
int main(int argc,char* argv[]){
	if(argc != 3) printf("cmd error!\n"),exit(0);
	signal(2,hand);
	serverFd = socket(AF_INET,SOCK_STREAM,0);
	if(-1  ==  serverFd) printf("创建socket失败:%m\n"),exit(-1);
	printf("创建socket成功!\n");

	//协议地址族
	struct sockaddr_in  addr = {0};
	addr.sin_family =   AF_INET;//和socket函数第一个参数一致
	addr.sin_addr.s_addr = inet_addr(argv[1]);//把字符串转成整型
	addr.sin_port = htons(atoi(argv[2]));//端口号

	//绑定
	int r = bind(serverFd,(struct sockaddr*)&addr,sizeof addr);
	if(-1  ==  r) printf("绑定失败:%m\n"),close(serverFd),exit(-1);
	printf("绑定成功!\n");

	//监听
	r = listen(serverFd,10);
	if(-1  ==  r) printf("监听失败:%m\n"),close(serverFd),exit(-1);
	printf("监听成功!\n");

	//接受客户端连接
	clientSocket = accept(serverFd,NULL,NULL);
	if(-1  ==  clientSocket) printf("接受客户端连接失败:%m\n"),close(serverFd),exit(-1);
	printf("接受客户端连接成功!\n");

	//通信
	char buff[256];
	while(1){
		r = recv(clientSocket,buff,255,0);//和read一样
		if(r>0){
			buff[r] = 0;//添加'\0'
			printf(">>%s\n",buff);
		}
	}

}

客服端代码

客户端代码

#include <stdio.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <signal.h>
#include <arpa/inet.h>
int serverFd;
int clientSocket;
void hand(){
	close(serverFd);
	close(clientSocket);
	exit(0);
}
int main(int argc,char* argv[]){
	if(argc != 3) printf("cmd error!\n"),exit(0);
	signal(2,hand);
	serverFd = socket(AF_INET,SOCK_STREAM,0);
	if(-1  ==  serverFd) printf("创建socket失败:%m\n"),exit(-1);
	printf("创建socket成功!\n");

	//协议地址族
	struct sockaddr_in  addr = {0};
	addr.sin_family =   AF_INET;//和socket函数第一个参数一致
	addr.sin_addr.s_addr = inet_addr(argv[1]);//把字符串转成整型
	addr.sin_port = htons(atoi(argv[2]));//端口号

	//连接服务器
	int r = connect(serverFd,(struct sockaddr*)&addr,sizeof addr);
	if(-1  ==  r) printf("连接服务器失败:%m\n"),close(serverFd),exit(-1);
	printf("连接服务器成功!\n");
	
	//通信
	char buff[256];
	while(1){
		memset(buff,0,256);
		printf("请输入>>");
		scanf("%s",buff);
		send(serverFd,buff,strlen(buff),0);
	}

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/157598.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

编译安装redis及配置多实例

yum安装是这种十分简单的方法我们就不在提及了&#xff0c;今天我们来做一下redis的编译安装 Redis源码包官方下载链接&#xff1a;http://download.redis.io/releases/ 一、编译安装&#xff1a; 安装依赖包 dnf -y install make gcc jemalloc-devel systemd-devel如果是…

Appium移动自动化测试--安装Appium

Appium 自动化测试是很早之前就想学习和研究的技术了&#xff0c;可是一直抽不出一块完整的时间来做这件事儿。现在终于有了。 反观各种互联网的招聘移动测试成了主流&#xff0c;如果再不去学习移动自动化测试技术将会被淘汰。 web自动化测试的路线是这样的&#xff1a;编程语…

java:IDEA中的Scratches and Consoles

背景 IntelliJ IDEA中的Scratches and Consoles是一种临时的文件编辑环境&#xff0c;用于写一些文本内容或者代码片段。 其中&#xff0c;Scratch files拥有完整的运行和debug功能&#xff0c;这些文件需要指定编程语言类型并且指定后缀。 举例&#xff1a;调接口 可以看到…

干扰项目成本估算精准度的5大因素

干扰项目成本估算精准度的因素有很多&#xff0c;这些因素可能导致成本估算的不准确性&#xff0c;增加成本偏差和额外的成本投入&#xff0c;从而对项目的进度和预算产生影响。因此&#xff0c;在进行项目成本估算时&#xff0c;需要充分考虑这些因素&#xff0c;并采取相应的…

API接口怎么对接电商平台获取商品详情数据

对于api接口的对接&#xff0c;你可以按照以下步骤进行操作&#xff1a; 1. 确定需求&#xff1a;首先要明确你的对接需求&#xff0c;即想要通过对接api接口实现什么功能&#xff0c;例如获取数据、实现支付等。 2. 寻找文档&#xff1a;在对接之前&#xff0c;要找到相关ap…

虚拟机配置网络ip,主打一个详细

文章目录 一、前言二、安装vim编辑器三、检查联网状态1. 使用ping命令 四、查看ip五、ens33网卡六、开机启动ens33网卡七、获取子网地址和子网掩码八、配置网关与子网掩码1. 编辑虚拟网络信息2. 配置网关3. 配置ens33网卡信息 九、动态ip配置十、静态ip配置 一、前言 本文主要…

面试题 Android 如何实现自定义View 固定帧率绘制

曾经遇到的面试题, 如何实现自定义View 1s内固定帧率的绘制. 当时对Android理解不深, 考虑的不全面, 直接回答了在onDraw结束时通过postDelay发送一个(1000 / 帧数)ms的延时消息触发invalidate进行下一次绘制. 但实际上这样做存在明显的问题 实际上1s绘制的帧数是不符合期望帧…

main函数的数组参数是干嘛用的

今天在看项目代码的时候&#xff0c;突然看到项目中用到了main函数的参数args&#xff0c;在这之前我还没怎么注意过这个参数&#xff0c;一时间居然不知道这个参数是干嘛的&#xff01; 虽然也写过一些java和scala&#xff0c;但是确实没遇到过会用这个参数的情况。 网上就查…

国鑫受邀出席2023松山湖软件和信息服务业高质量发展大会

为推动粤港澳大湾区的软件和先进制造产业的融合发展&#xff0c;“2023松山湖软件和信息服务业高质量发展大会”于今日在松山湖畔隆重举办&#xff0c;会议以“推动软件和制造业深度融合发展&#xff0c;打造软件和信息服务业集聚高地”为主题&#xff0c;聚焦工业软件应用、智…

springboot引入redisson分布式锁及原理

1.引入依赖 <dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version>3.13.6</version> </dependency>2.配置类创建bean /*** author qujingye* Classname RedissonConfig* Description TOD…

数据结构与集合源码

我是南城余&#xff01;阿里云开发者平台专家博士证书获得者&#xff01; 欢迎关注我的博客&#xff01;一同成长&#xff01; 一名从事运维开发的worker&#xff0c;记录分享学习。 专注于AI&#xff0c;运维开发&#xff0c;windows Linux 系统领域的分享&#xff01; 本…

java调用c函数

一、关于JNI JNI是Java Native Interface的缩写&#xff0c;JNI是JAVA平台专门用于和本地C代码进行相互操作的API&#xff0c;称为JAVA本地接口。 二、JNI开发流程 1.在JAVA中先声明一个native方法。2.通过javac -h或javah -jni命令导出JNI使用的C头头文件。3.使用C实现本地方…

跨国企业扎根中国市场,应该选择什么样的云服务?

众所周知&#xff0c;伴随着中国经济的高速发展&#xff0c;越来越多的跨国企业都将目光瞄向了中国市场。 然而&#xff0c;要想扎根中国市场&#xff0c;开展本地业务创新&#xff0c;什么样的云服务商才是这些跨国企业的最佳选择&#xff1f; 跨国企业转型创新的三大趋势 面对…

鸿蒙应用开发初尝试《创建项目》,之前那篇hello world作废

经过几年的迅速发展&#xff0c;鸿蒙抛弃了JAVA写应用的方式&#xff0c;几年前了解的鸿蒙显然就gg了。 这几年鸿蒙发布了方舟&#xff08;ArkUI Arkts&#xff09;&#xff0c;将TypeScript作为了推荐开发语言&#xff0c;你依然可以用FAJS,但华为推荐用StageArkTs!!!那么你还…

如何在工作外发展副业?主业和副业该如何权衡

有一句话说得好&#xff0c;不要把所有的鸡蛋放在一个篮子里。在面对繁忙的工作生活之外&#xff0c;想要拥有额外的收入来源那就是做一份不影响主业的副业。而副业的发展&#xff0c;不仅能够增加收入&#xff0c;更可以拓展个人的技能和兴趣。 主业跟副业该如何权衡呢&#x…

UI原型图

最近没啥项目&#xff0c;闲来无事&#xff0c;研究了一下原型图&#xff0c;万一以后年龄大了&#xff0c;代码敲不动还可以画画原型图&#xff0c;嘿嘿嘿 今天研究了两款画原型图的工具&#xff0c;即时设计-即时设计 - 可实时协作的专业 UI 设计工具 MODAO-墨刀 两款工具…

WordPress网站迁移实战经验

前几日,网站服务器到期,换了服务商,就把我的WordPress的网站迁移到本地电脑了。方便以后文章迁移。 本次迁移网站主要经历以下几个步骤。 1.域名转出。 2.备份数据库及网站文件下载。 3.重新搭建WordPress网站。 4.网站文件及数据库导入。 下面详细介绍下每个步骤的操作…

Gooxi亮相2023世界互联网大会 展现AI创新实力

■■ 11月7日&#xff0c;2023年世界互联网大会在中国乌镇正式拉开序幕&#xff0c;作为世界互联网一年一度的盛大集会&#xff0c;此次大会以“建设包容、普惠、有韧性的数字世界——携手构建网络空间命运共同体”为主题&#xff0c;涵盖5G与6G、IPv6、人工智能、大数据、网络…

【Linux】C文件系统详解(一)——C文件操作

文章目录 文件操作总结预备知识结论: C文件操作回顾语言方案w写入方式a写入方式r只读方式 系统方案但是这个**没有设置权限**,需要这样改: 文件操作总结 1.文件描述符,重定向,缓冲区,语言和系统关于文件的不同的视角的理解 – 都是要让我们深刻理解文件 2.文件系统 3.动静态库 …