Linux Socket网络编程 循环互相通信

2023-10-31

 一  效果展示

持续互相通信,上面是服务端,下面为客户端加上ip,最后客户端输入exit退出

 二 代码展示

服务端

/*server.c*/
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <netinet/in.h>
#include <netdb.h>
#define portnumber           3333
int main(int argc ,char *argv[])
{
	struct sockaddr_in server_addr;
	struct sockaddr_in client_addr;
	int sin_size;
	int nbytes;
	int sockfd, new_fd;
	char buffer[1024];
	char sendbuf[1024];

	/*建立socket连接*/
	if ((sockfd = socket(AF_INET,SOCK_STREAM,0))== -1)
	{
		fprintf(stderr,"Socket error :%s\n\a",strerror(errno));
		exit(1);
	}
	printf("socket id=%d",sockfd);

	/*设置sockaddr_in 结构体中相关参数*/
	bzero(&server_addr,sizeof(struct sockaddr_in));
	server_addr.sin_family = AF_INET;

	server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
	//server_addr.sin_addr.s_addr = inet_addr("192.168.1.1");
	server_addr.sin_port = htons(portnumber);
	/*绑定函数bind()*/
	if (bind(sockfd, (struct sockaddr *) (&server_addr), 
				sizeof(struct sockaddr)) == -1)
	{
		fprintf(stderr,"Bind error :%s\n\a",strerror(errno));
		exit(1);
	}
	printf("binding succeed!\n");
	/*调用listen()函数,创建未处理请求的队列*/
	if (listen(sockfd,5) == -1)
	{
		fprintf(stderr,"Listen error :%s\n\a",strerror(errno));
		exit(1);
	}
	printf("Listening...\n");
	/*调用accept()函数,等待客户端的连接*/
	while(1)
	{
		memset(buffer,0x00,1024);
		sin_size =sizeof(struct sockaddr_in);
		if ((new_fd = accept(sockfd, 
						(struct sockaddr *)&client_addr, &sin_size)) == -1)
		{
			fprintf(stderr,"Accept error :%s\n\a",strerror(errno));
			exit(1);
		}
		fprintf(stderr,"Server get connection from %d\n",inet_ntoa   (client_addr.sin_addr));
		if ((nbytes = read(new_fd, buffer,1024)) == -1)
		{
			fprintf(stderr,"Read error :%s\n\a",strerror(errno));
			exit(1);
		}
		char content[1024];
		if (strlen(buffer)>0)
		{
			buffer[nbytes] = '\0';
			printf("Server received  %s\n", buffer);
				if(strncmp(buffer, "exit", 4)==0)
			{
				close(sockfd);
				exit(0);
			}
			else
			{
					/*发送消息给服务器端*/
					printf("Input to client: ");
					fgets(content,1024,stdin);
					send(new_fd,content,strlen(content),0);
			}
			
		}
		close(new_fd);
	}
	exit(0);
}

 客户端

 

/*client.c*/
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#define portnumber           3333
int main(int argc, char *argv[])
{
	int sockfd;
	int recvbytes;
	char buffer[1024];
	char revbuf[1024];
	struct hostent *host ;
	struct sockaddr_in server_addr;

	if(argc != 2)
	{
		fprintf(stderr,"Usage :%s hostname \a\n",argv[0]);
		exit(1);
	}

	/*地址解析函数*/
	if ((host = gethostbyname(argv[1])) == NULL)
	{
		fprintf(stderr,"Gethostbyname error\n");
		exit(1);
	}


	
	while(1){

			/*创建socket*/
		if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
		{
			fprintf(stderr,"Socket Error :%s\a\n",strerror(errno));
			exit(1);
		}
		/*设置sockaddr_in 结构体中相关参数*/
		bzero(&server_addr,sizeof(server_addr));
		server_addr.sin_family = AF_INET;
		server_addr.sin_port = htons(portnumber);
		server_addr.sin_addr = *((struct in_addr *)host->h_addr);
		/*调用connect函数主动发起对服务器端的连接*/
			if(connect(sockfd,(struct sockaddr *) (&server_addr), 
						sizeof(struct sockaddr))== -1)
			{
				fprintf(stderr,"Connect Error :%s\a\n",strerror(errno));
				exit(1);
			}
			
		printf("Input to server: ");

		/*发送消息给服务器端*/
		fgets(buffer,1024,stdin);
		//write(sockfd, buffer, strlen(buffer));
		send(sockfd,buffer,strlen(buffer),0);
		/*调用recv()函数接收客户端的请求*/
		memset(revbuf, 0, sizeof(revbuf));
		if ((recvbytes = recv(sockfd, revbuf, sizeof(revbuf), 0)) == -1)
		{
			perror("recv");
			exit(1);
		}
		printf("Received a message: %s\n", revbuf);
		close(recvbytes);
		close(sockfd);
	}
	
	exit(0);
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux Socket网络编程 循环互相通信 的相关文章

  • Tomcat Intellij Idea:远程部署

    RackSpace 云服务器 Ubuntu 12 04 Intellij Idea 11 1 2 Windows 8 Tomcat 7 0 26 JDK 6 在 Intellij Idea 上 当我尝试在远程 Tomcat 7 服务器上运行
  • 仅使用containerd(不使用Docker)修剪容器镜像

    如果我刚刚containerd安装在 Linux 系统上 即 Docker 是not安装 如何删除未使用的容器映像以节省磁盘空间 Docker 就是这么方便docker system prune https docs docker com
  • Linux 中 m 标志和 o 标志将存储在哪里

    我想知道最近收到的路由器通告的 m 标志和 o 标志的值 从内核源代码中我知道存储了 m 标志和 o 标志 Remember the managed otherconf flags from most recently received R
  • 有没有一种快速方法可以从 Jar/war 中删除文件,而无需提取 jar 并重新创建它?

    所以我需要从 jar war 文件中删除一个文件 我希望有类似 jar d myjar jar file I donot need txt 的内容 但现在我能看到从 Linux 命令行执行此操作的唯一方法 不使用 WinRAR Winzip
  • 适用于 Linux 的轻量级 IDE [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 在 C 中使用单个消息队列是否可以实现双向通信

    我希望服务器向客户端发送一些消息 并让客户端确认它 我被分配了这个任务 我可以在 C linux 中使用单个消息队列来完成它还是我需要创建两个 谢谢 是的 可以使用 sysV 消息队列来做到这一点 从您之前的问题来看 您正在使用该队列 您可
  • Google BQ:运行参数化查询,其中参数变量是 BQ 表目标

    我正在尝试从 Linux 命令行为 BQ 表目标运行 SQL 此 SQL 脚本将用于多个日期 客户端和 BQ 表目标 因此这需要在我的 BQ API 命令行调用中使用参数 标志 parameter 现在 我已经点击此链接来了解参数化查询 h
  • 使用 \r 并打印一些文本后如何清除控制台中的一行?

    对于我当前的项目 有一些代码很慢并且我无法使其更快 为了获得一些关于已完成 必须完成多少的反馈 我创建了一个进度片段 您可以在下面看到 当你看到最后一行时 sys stdout write r100 80 n I use 80覆盖最终剩余的
  • 在 Linux 上以编程方式设置 DNS 名称服务器

    我希望能够通过我的 C C 程序为 Linux 上的 DNS 名称服务器添加 IP 地址 我在一个带有只读 etc resolv conf 的嵌入式平台上 这意味着我不能简单地将 nameserver xxx xxx xxx xxx 行添加
  • 如何阻止ubuntu在使用apt安装或更新软件包时弹出“Daemons using outdatedlibraries”? [关闭]

    Closed 这个问题是与编程或软件开发无关 help closed questions 目前不接受答案 我最近新安装了 Ubuntu 22 04 LTS 我发现每次使用 apt 安装或更新软件包时 它都会询问我有关Which servic
  • 从 ttyUSB0 写入和读取,无法得到响应

    我对 Linux tty 不太有经验 我的环境是带有丰富 USB 串行的 Raspbian 什么有效 stty F dev ttyUSB0 38400 cu l dev ttyUSB0 s 38400 cu to dev ttyUSB0作品
  • C 语言的符号表

    我目前正在开发一种执行模式匹配的静态分析工具 我在用Flex https github com westes flex生成词法分析器 我编写了代码来管理符号表 我不太有经验C 所以我决定将符号表实现为线性链表 include
  • .net-core:ILDASM / ILASM 的等效项

    net core 是否有相当于 ILDASM ILASM 的功能 具体来说 我正在寻找在 Linux 上运行的东西 因此为什么是 net core ildasm 和 ilasm 工具都是使用此存储库中的 CoreCLR 构建的 https
  • Bash - 在与当前终端分开的另一个终端中启动命令的新实例

    我有一个简单的 bash 脚本 test sh 设置如下 bin bash args if args 0 check capture then watch n 1 ls lag home user capture0 watch n 1 ls
  • 如何使用waf构建共享库?

    我想使用构建一个共享库waf http code google com p waf 因为它看起来比 GNU 自动工具更容易 更简洁 到目前为止 我实际上有几个与我开始编写的 wscript 有关的问题 VERSION 0 0 1 APPNA
  • Mac OS X 上的 /proc/self/cmdline / GetCommandLine 等效项是什么?

    如何在不使用 argc argv 的情况下访问 Mac OS X 上的命令行 在 Linux 上 我会简单地阅读 proc self cmdline or use GetCommandLine在 Windows 上 但我找不到 Mac OS
  • 为什么opencv videowriter这么慢?

    你好 stackoverflow 社区 我有一个棘手的问题 我需要你的帮助来了解这里发生了什么 我的程序从视频采集卡 Blackmagic 捕获帧 到目前为止 它工作得很好 同时我用 opencv cv imshow 显示捕获的图像 它也工
  • 如何使用Android获取Linux内核的版本?

    如何在 Android 应用程序中获取 Linux 内核的版本 不是 100 确定 但我认为调用 uname r 需要 root 访问权限 无论如何 有一种不太肮脏的方法可以做到这一点 那就是 System getProperty os v
  • 从 Linux 内核模块中调用用户空间函数

    我正在编写一个简单的 Linux 字符设备驱动程序 以通过 I O 端口将数据输出到硬件 我有一个执行浮点运算的函数来计算硬件的正确输出 不幸的是 这意味着我需要将此函数保留在用户空间中 因为 Linux 内核不能很好地处理浮点运算 这是设
  • 使用自定义堆的类似 malloc 的函数

    如果我希望使用自定义预分配堆构造类似 malloc 的功能 那么 C 中最好的方法是什么 我的具体问题是 我有一个可映射 类似内存 的设备 已将其放入我的地址空间中 但我需要获得一种更灵活的方式来使用该内存来存储将随着时间的推移分配和释放的

随机推荐

  • 『phphot』【SD2.0大会】毛新生:“傻瓜”软件将成用户最爱

    原文链接 http blog csdn net phphot archive 2007 11 30 1909244 aspx作者 phphot phphot http blog csdn net phphot 中国最大的IT技术社区CSDN
  • JAVA使用mysql加密解密函数(AES_ENCRYPT/AES_DECRYPT)

    前言 最近大学做JavaWeb课设时发现 很多同学的有关于账号密码都是明文储存在mysql数据库中 其实这样做在实际应用中是非常不安全的 其实mysql最近本身就提供了非常好的两个函数来供我们去加密解密我们要存入的数据 下面我们就来介绍一下
  • JS中Array的forEach、map、filter方法区别?

    一 基本用法 1 forEach 函数用于对数组中的每个元素执行给定的函数 而它不返回任何值 它只是对每个元素调用传入的函数 这个函数可以接受三个参数 当前元素的值 当前元素的索引和整个数组 const arr 1 2 3 arr forE
  • 2023年第二届全国大学生数据统计与分析竞赛题目B:电影评分的大数据分析

    竞赛信息 在大数据时代背景下 统计学作为大数据分析领域的基础显得尤为重要 为了帮助学生更好的学习和应用数据统计与分析的知识 促进统计 计算机 数学等相关专业的发展 培养具有数据分析与应用型人才 经研究决定 中国国际经济技术合作促进会教育发展
  • HBase集群搭建记录

    本文目录 写在前面 step1 Maven的下载与配置 1 下载解压 2 环境变量设置 3 查看安装 4 设置阿里云镜像 加速jar包下载 step2 Maven项目的创建 1 创建项目 2 编译项目 3 测试项目 4 打包项目 5 安装项
  • 秒杀多线程第十二篇 多线程同步内功心法——PV操作上

    秒杀多线程第十二篇 多线程同步内功心法 PV操作上 前面的文章讲解了在Windows系统下实现多线程同步互斥的方法 为了提高在实际问题中分析和思考多个线程之间同步互斥问题的能力 接下来将讲解PV操作 这也是操作系统中的重点和难点 本文将会先
  • GitHub上9款美观大气的后台管理系统,基于但不限于vue、react、Angular、Bootstrap框架

    文章目录 1 vue element admin 2 D2Admin 3 Vue admin better 4 AdminLTE 5 Ant Desiong Pro 6 Tabler 7 ngx admin 8 Gentelella 9 b
  • 桥接与NAT连接的区别

    一 网络模式 我们首先说一下VMware的几个虚拟设备 VMnet0 用于虚拟桥接网络下的虚拟交换机 VMnet1 用于虚拟Host Only网络下的虚拟交换机 VMnet8 用于虚拟NAT网络下的虚拟交换机 VMware NetworkA
  • BUUCTF [MRCTF2020]Ez_bypass

    BUUCTF MRCTF2020 Ez bypass 记录一次BUUCTF做题过程 分析 实操 记录一次BUUCTF做题过程 首先打开题目 将其还原 大概是这样 I put something in F12 for you
  • OpenBrush 工程项目源码学习(一):在macOS编译至Oculus Quest 2运行

    开发环境 MacBook Pro 2017 macOS Big Sur Version 11 6 Unity 2021 3 4 f1 步骤 Step 1 访问 https github com icosa gallery open brus
  • kafka_2.12-3.1.0集群安装配置(zookeeper-3.6.3)

    文章目录 安装kafka 2 12 3 1 0 安装环境 安装步骤 1 下载安装包 2 修改配置文件 修改server properties 添加环境变量 3 启动kafka 安装kafka 2 12 3 1 0 安装环境 CentOS版本
  • 【笔记:模拟MOS集成电路】带隙基准(基本原理+电流模+电压模电路详解)

    在模拟电路中 广泛的包含电压基准和电流基准 而且电路增益 输出噪声和功耗等参数常与基准直接相关 这种基准一般是直流量 要求基准与电源 工艺参数以及温度无关 PVT 而下面要讨论的带隙基准 主要作用就是建立一个与温度无关的基准源 产生基准的目
  • rest以及restful的基本理解

    传统下的API接口 http是目前在互联网上使用最多的协议 没有之一 可是http的创始人一直都觉得 在过去10几年来 所有的人都在错误的使用Http 这句话怎么说呢 如果说你要删除一个数据 以往的做法通常是 delete id 如果你要更
  • 电脑抓屏按钮使用:

    键盘上 Print Screen Sys Rq 键的作用是屏幕抓图 用法一 按 Print Screen SysRq 一下 对当前屏幕进行抓图 就是整个显示屏的内容 用法二 先按住 Alt 键 再按 Print Screen SysRq 键
  • HBase高手之路1-Hbase简介

    文章目录 HBase高手之路1 Hbase简介 一 什么是HBase 1 HBase简介 2 HBase的发展过程 二 HBase特点 1 海量存储 2 列式存储 3 极易扩展 4 高并发 5 稀疏 6 强一致性读 写 7 自动分块 8 自
  • Web服务器的搭建

    一 Web服务器简介 Web服务器的基本功能是提供web信息浏览服务 主要涉及的协议是HTTP协议 二 Web服务器的搭建 1 安装httpd包 2 关闭防火墙 3 启动httpd服务 4 备份conf文件 5 配置浏览器网页读取的根目录
  • 微服务相关面试要点

    什么是springboot 用来简化spring应用的初始搭建以及开发过程 使用特定的方式来进行配置 properties或yml文件 创建独立的spring引用程序 main方法运行 嵌入的Tomcat 无需部署war文件 简化maven
  • python读视频文件_python读取和保存视频文件

    如何用python实现视频关键帧提取并保存为图片 也许你会觉得对小编多做一点事你会觉得你很爽 可是在小编看来这是不屑的 import cv2vc cv2 VideoCapture Test avi 读入视频文件c 1if vc isOpen
  • linux安装anaconda

    linux安装anaconda 1 下载anaconda Conda 是一个强大的包管理器和环境管理器 您可以在 Windows 的 Anaconda Prompt 或 macOS 或 Linux 的终端窗口中与命令行命令一起使用 换句话说
  • Linux Socket网络编程 循环互相通信

    一 效果展示 持续互相通信 上面是服务端 下面为客户端加上ip 最后客户端输入exit退出 二 代码展示 服务端 server c include