【项目 计网5】 4.15 TCP通信实现(服务器端)4.16 TCP通信实现(客户端)

news/2024/11/17 20:35:59/

文章目录

    • 4.15 TCP通信实现(服务器端)
    • 4.16 TCP通信实现(客户端)


4.15 TCP通信实现(服务器端)

// TCP 通信的服务器端// TCP 通信的服务器端
#include <stdio.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>int main(){//1、创建socket(用于监听)int lfd = socket(AF_INET,SOCK_STREAM,0);if(lfd == -1){perror("socket");exit(0);}//2、绑定struct sockaddr_in saddr;saddr.sin_family = AF_INET; //协议族//把点分十进制IP地址转换成int 而且是网络字节序的//saddr->sin_addr.s_addr 本质是一个长整型的变量  结构体套结构体//第三个参数是传出参数,也就是转换好的void* 直接就给了saddr->sin_addr.s_addrinet_pton(AF_INET,"192.168.65.129",&saddr.sin_addr.s_addr); //p:point 点分十进制/*saddr->sin_addr.s_addr = 0; saddr->sin_addr.s_addr = INADDR_ANY;  INADDR_ANY这个宏就是00.0.0.0  表示任意地址 比如一台主机有两个网卡,两个都绑定客户端无论用哪一个IP地址 都可以访问到这台主机*///saddr->sin_port = 9999; 这是主机字节序的9999 要转成网络字节序saddr.sin_port = htons(9999);int ret = bind(lfd,(struct sockaddr*)&saddr,sizeof(saddr));if(ret == -1){perror("bind");exit(0);}//3、监听ret = listen(lfd,8);if(ret == -1){perror("listen");exit(0);}//4、接收客户端连接struct sockaddr_in clientaddr;socklen_t len = sizeof(clientaddr);int cfd = accept(lfd,(struct sockaddr*)&clientaddr,&len);if(cfd == -1){perror("accept");exit(0);}//打印客户端信息//把获取到的网络字节序IP和端口转换成主机字节序char clientIp[16];inet_ntop(AF_INET,&clientaddr.sin_addr.s_addr,clientIp,sizeof(clientIp));unsigned short clientPort = ntohs(clientaddr.sin_port);printf("client IP is: %s, port is %d: \n",clientIp,clientPort);//5、通信//获取客户端数据char recvBuf[1024] = {0};len = read(cfd,recvBuf,sizeof(recvBuf));if(len == -1){perror("accept");exit(0);}else if(len > 0){printf("recv client data = %s\n",recvBuf);}else if(len == 0){//表示客户端关闭连接printf("client close...");}//给客户端发送数据char* data = "hello,i am server";write(cfd,data,strlen(data));//6、关闭文件描述符close(cfd);close(lfd);return 0;
}

4.16 TCP通信实现(客户端)

// TCP 通信的服务器端
#include <stdio.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>int main(){//1、创建socket(用于监听)int lfd = socket(AF_INET,SOCK_STREAM,0);if(lfd == -1){perror("socket");exit(0);}//2、绑定struct sockaddr_in saddr;saddr.sin_family = AF_INET; //协议族//把点分十进制IP地址转换成int 而且是网络字节序的//saddr->sin_addr.s_addr 本质是一个长整型的变量  结构体套结构体//第三个参数是传出参数,也就是转换好的void* 直接就给了saddr->sin_addr.s_addrinet_pton(AF_INET,"192.168.65.129",&saddr.sin_addr.s_addr); //p:point 点分十进制/*saddr->sin_addr.s_addr = 0; saddr->sin_addr.s_addr = INADDR_ANY;  INADDR_ANY这个宏就是00.0.0.0  表示任意地址 比如一台主机有两个网卡,两个都绑定客户端无论用哪一个IP地址 都可以访问到这台主机*///saddr->sin_port = 9999; 这是主机字节序的9999 要转成网络字节序saddr.sin_port = htons(9999);int ret = bind(lfd,(struct sockaddr*)&saddr,sizeof(saddr));if(ret == -1){perror("bind");exit(0);}//3、监听ret = listen(lfd,8);if(ret == -1){perror("listen");exit(0);}//4、接收客户端连接struct sockaddr_in clientaddr;socklen_t len = sizeof(clientaddr);int cfd = accept(lfd,(struct sockaddr*)&clientaddr,&len);if(cfd == -1){perror("accept");exit(0);}//打印客户端信息//把获取到的网络字节序IP和端口转换成主机字节序char clientIp[16];inet_ntop(AF_INET,&clientaddr.sin_addr.s_addr,clientIp,sizeof(clientIp));unsigned short clientPort = ntohs(clientaddr.sin_port);printf("client IP is: %s, port is %d: \n",clientIp,clientPort);//5、通信//获取客户端数据char recvBuf[1024] = {0};len = read(cfd,recvBuf,sizeof(recvBuf));if(len == -1){perror("accept");exit(0);}else if(len > 0){printf("recv client data = %s\n",recvBuf);}else if(len == 0){//表示客户端关闭连接printf("client close...");}//给客户端发送数据char* data = "hello,i am server";write(cfd,data,strlen(data));//6、关闭文件描述符close(cfd);close(lfd);return 0;
}

http://www.ppmy.cn/news/1055654.html

相关文章

利用tidevice+mysql+grafana实现ios性能测试

利用tidevicemysqlgrafana实现ios性能测试 1.什么是tidevice&#xff1f; tidevice是一个可以和ios设备进行通信的工具&#xff0c;提供以下功能&#xff1a; 截图获取手机信息ipa包的安装和卸载根据bundleID 启动和停止应用列出安装应用信息模拟Xcode运行XCTest&#xff0c…

「Java」《Java集合框架详解:掌握常用集合类,提升开发效率》

Java集合框架详解&#xff1a;掌握常用集合类&#xff0c;提升开发效率 摘要&#xff1a;一. 引言二. 集合框架概述三. 集合接口详解四. 集合类的选择五. 泛型和类型安全六. 集合的线程安全七. 高级集合类和算法八、Java集合实践操作示例1. 创建和初始化集合&#xff1a;2. 遍历…

vue 使用print.js打印小票

官网&#xff1a;https://printjs.crabbly.com/ // 安装 npm install print-js --save// 引入 import printJS from print-js// 使用 printJS({printable: https://hwke.tbbug.com/images/phone/1899ed9346f64020ff4f9bbae6983952.jpg,type: image,imageStyle: width:100%;ma…

【leetcode 力扣刷题】交换链表中的节点

24. 两两交换链表中的节点 24. 两两交换链表中的节点两两节点分组&#xff0c;反转两个节点连接递归求解 24. 两两交换链表中的节点 题目链接&#xff1a;24. 两两交换链表中的节点 题目内容&#xff1a; 题目中强调不能修改节点内部值&#xff0c;是因为如果不加这个限制的话…

Qt的输出

目录 基本分类 C风格输出 C风格 可以抑制输出 方法一 方法二 在Qt中进行log输出, 一般不使用c中的printf, 也不是使用C中的cout, Qt框架提供了专门用于日志输出的类, 头文件名为 QDebug。 基本分类 qDebug&#xff1a;调试信息提示 qInfo &#xff1a;输出信息 qWarnin…

AR地图微信小程序:数字化时代下地图应用的新突破

随着数字化时代的到来&#xff0c;地图应用成为人们日常生活中不可或缺的工具。而随着增强现实&#xff08;AR&#xff09;技术的快速发展&#xff0c;AR地图微信小程序应运而生&#xff0c;为用户提供了一种全新的地图导航体验。本文将深入探讨AR地图微信小程序的专业性和思考…

CSS background 背景

background属性为元素添加背景效果。 它是以下属性的简写&#xff0c;按顺序为&#xff1a; background-colorbackground-imagebackground-repeatbackground-attachmentbackground-position 以下所有示例中的花花.jpg图片的大小是4848。 1 background-color background-col…

Datawhale AI夏令营 - 用户新增预测挑战赛 | 学习笔记

数据分析与可视化 为了拟合出更好的结果就要了解训练数据之间的相互关系&#xff0c;进行数据分析是必不可少的一步 导入必要的库 # 导入库 import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns pandas库是一个强大的分析结构化…