Basic TCP Server Client

server/2024/9/22 15:31:06/

Server

#include <stdio.h>
#include <string.h>
#include <unistd.h> // read and write (TCP); sendto and recvfrom (UDP)
#include <arpa/inet.h> // 包含#include <sys/socket.h>int main(int argc, char* argv[]) {// 1. 创建监听fdint fd = socket(PF_INET, SOCK_STREAM, 0);if (fd == -1) {perror("socket");return -1;}// 2. 绑定监听fdstruct sockaddr_in saddr;memset(&saddr, 0, sizeof(saddr)); saddr.sin_family = AF_INET;saddr.sin_port = htons(9999);saddr.sin_addr.s_addr = INADDR_ANY; // 宏INADDR_ANY(可以绑定本地)实际值是0=0.0.0.0;由于大小端没区别,因此无需htonlint ret = bind(fd, (struct sockaddr*)&saddr, sizeof(saddr));if (ret == -1) {perror("bind");return -1;}// 3. 设置监听ret = listen(fd, SOMAXCONN); // #define SOMAXCONN 128 // 最大监听队列长度 内部定义过来if (ret == -1) {perror("listen");return -1;}// 4. 阻塞并等待客户端连接struct sockaddr_in caddr;memset(&caddr, 0, sizeof(caddr));socklen_t caddr_len = sizeof(caddr);int cfd = accept(fd, (struct sockaddr*)&caddr, &caddr_len); // 返回通信fdif (cfd == -1) {perror("accept");return -1;}// 连接成功,打印客户端信息// char* ip; inet_pton(AF_INET, &caddr.sin_addr.s_addr, ip, sizeof(ip)); 亦可printf("client socket %d, Address: %s:%d\n", cfd, inet_ntoa(caddr.sin_addr), ntohs(caddr.sin_port));// 5. 通信while (1) {char buf[1024];int len = recv(cfd, buf, sizeof(buf), 0);if (len > 0) {printf("client say: %s\n", buf);send(cfd, buf, len, 0); // 长度指定为len 不要传多了} else if (len == 0) {printf("客户端已经断开连接...\n");break;} else if (len == -1) {perror("recv");break;}} // 跳出后说明通信结束close(cfd);close(fd);return 0;
}

Client

#include <stdio.h>
#include <string.h>
#include <unistd.h> // read and write (TCP); sendto and recvfrom (UDP)
#include <arpa/inet.h> // 包含#include <sys/socket.h>int main(int argc, char* argv[]) {// 1. 创建通信fdint fd = socket(PF_INET, SOCK_STREAM, 0); // AF_*和PF_*值完全相同,通常混用if (fd == -1) {perror("socket");return -1;}// 2. 连接服务器struct sockaddr_in saddr;memset(&saddr, 0, sizeof(saddr)); saddr.sin_family = AF_INET;saddr.sin_port = htons(9999);inet_pton(AF_INET, "127.0.0.1", &saddr.sin_addr.s_addr);saddr.sin_addr.s_addr = inet_addr("127.0.0.1"); // 或者直接指定ip: 172.31.78.11int ret = connect(fd, (struct sockaddr*)&saddr, sizeof(saddr));if (ret == -1) {perror("connect");return -1;}printf("socket connect successful!\n");// 3. 通信int number = 0;while (1) {char buf[1024];sprintf(buf, "hello, message number #%d...\n", number++); // sprintf将数据写入字符串 而非输出到标准输出流send(fd, buf, strlen(buf)+1, 0); // 注意这里不要发送sizeof(buf),发送实际字符数+'\0'memset(buf, 0, sizeof(buf)); // 有必要清空buf的int len = recv(fd, buf, sizeof(buf), 0);if (len > 0) {printf("server say: %s\n", buf);} else if (len == 0) {printf("服务器已经断开连接...\n");break;} else if (len == -1) {perror("recv");break;}sleep(1); // 让客户端1秒发一条} // 跳出后说明通信结束close(fd);return 0;
}

http://www.ppmy.cn/server/8065.html

相关文章

AI安全之问:我们的智能助手真的安全吗?

在我们日益依赖人工智能来撰写文档、编写程序代码、甚至创作艺术作品的今天&#xff0c;我们是否曾经想过这些智能系统可能面临的被恶意操纵的风险&#xff1f; 分享几个网站 GPT-3.5研究测试&#xff1a; https://hujiaoai.cn GPT-4研究测试&#xff1a; https://higpt4.cn…

C++相关概念和易错语法(8)(匿名对象、构造+拷贝构造优化、构造析构顺序)

1.匿名对象 当我们实例化对象后&#xff0c;有的对象可能只使用一次&#xff0c;之后就没用了。这个时候我们往往要主动去析构它&#xff0c;否则会占着浪费空间。但是如果遇到大量的这种情况&#xff0c;我们并不想每次都去创建对象、调用、析构&#xff0c;这样会写出很多重…

数据结构––kmp算法(串)

kmp算法作为串的一个重要内容&#xff0c;必然有一定的难度&#xff0c;而在看到各类教辅书里的概念与解释后&#xff0c;其晦涩难懂的内容直接劝退一部分人&#xff0c;现在&#xff0c;让我们来看看吧 KMP解决的问题类型 KMP算法的作用就是在一个已知的字符串中查找子串的位…

【学习笔记之vue】vue项目放在springboot项目里后,刷新页面会显示whitelabel error page

vue项目放在springboot项目里后&#xff0c;刷新页面会显示whitelabel error page。 解决方案: 当你在Spring Boot项目中嵌入Vue项目&#xff0c;并且刷新页面时遇到了“Whitelabel Error Page”&#xff0c;这通常意味着Spring Boot后端没有正确地处理前端路由的请求。Vue.j…

windows下python opencv ffmpeg读取摄像头实现rtsp推流 拉流

windows下python opencv ffmpeg读取摄像头实现rtsp推流 拉流 整体流程1.下载所需文件1. 1下载rtsp推流服务器1.2 下载ffmpeg2. 开启RTSP服务器3. opencv 读取摄像头并调用ffmpeg进行推流4. opencv进行拉流5. opencv异步拉流整体流程 1.下载所需文件 1. 1下载rtsp推流服务器 下…

SpringMVC--RESTful

1. RESTful 1.1. RESTful简介 REST&#xff1a;Representational State Transfer&#xff0c;表现层资源状态转移。 RESTful是一种网络架构风格&#xff0c;它定义了如何通过网络进行数据的交互。这种风格基于HTTP协议&#xff0c;使得网络应用之间的通信变得更加简洁和高效。…

数据结构与算法学习笔记五--串

目录 前言 一、定义 二、串的表示和实现 1.定长顺序存储表示 1.定义 2.串拼接 3.求子串 4.完整代码 2.堆分配存储表示 1.定义 2.求串长 3.串比较 4.清空s串&#xff0c;释放空间 5.串拼接 6.求子串 7.完整代码 3.串的块链存储表示 前言 这篇文章主要记录下串的…

SpringBoot如何创建监听器?

在Java中&#xff0c;监听器&#xff08;Listener&#xff09;是一种设计模式&#xff0c;它允许对象在 特定事件 发生时 自动执行某些操作 。这种设计模式通常用于实现 发布-订阅模型 &#xff0c;其中监听器&#xff08;订阅者&#xff09;订阅了某个对象&#xff08;发布者&…