socket 一个完整的不错的示例

从客户端向服务器端发送信息时,在服务器端有打印显示;

检测环境常用,备份一下

0,公共头文件代码

//config.h#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <unistd.h>
#include <errno.h>
#include <netinet/in.h>
#include <netdb.h>
#include <arpa/inet.h>const int MAX_LINE = 4096;
const int PORT = 6000;
const int BACKLOG = 10;
const int LISTENQ = 6666;
const int MAX_CONNECT = 20;

1,服务器代码

/** server.c
*/#include "config.h"int main(int argc , char **argv)
{/*声明服务器地址和客户链接地址*/struct sockaddr_in servaddr , cliaddr;/*声明服务器监听套接字和客户端链接套接字*/int listenfd , connfd;pid_t childpid;/*声明缓冲区*/char buf[MAX_LINE];socklen_t clilen;/*(1) 初始化监听套接字listenfd*/if((listenfd = socket(AF_INET , SOCK_STREAM , 0)) < 0){perror("socket error");exit(1);}//if/*(2) 设置服务器sockaddr_in结构*/bzero(&servaddr , sizeof(servaddr));servaddr.sin_family = AF_INET;//servaddr.sin_addr.s_addr = htonl(INADDR_ANY); //表明可接受任意IP地址servaddr.sin_addr.s_addr = inet_addr("10.20.30.40");//此处服务器本机ip,可以换成上一行servaddr.sin_port = htons(PORT);/*(3) 绑定套接字和端口*/if(bind(listenfd , (struct sockaddr*)&servaddr , sizeof(servaddr)) < 0){perror("bind error");exit(1);}//if/*(4) 监听客户请求*/if(listen(listenfd , LISTENQ) < 0){perror("listen error");exit(1);}//if/*(5) 接受客户请求*/for( ; ; ){clilen = sizeof(cliaddr);if((connfd = accept(listenfd , (struct sockaddr *)&cliaddr , &clilen)) < 0 ){perror("accept error");exit(1);}//if//新建子进程单独处理链接if((childpid = fork()) == 0){close(listenfd);//str_echossize_t n;char buff[MAX_LINE];while((n = read(connfd , buff , MAX_LINE)) > 0){write(connfd , buff , n);printf("rec: %s", buff);}exit(0);}//ifclose(connfd);}//for/*(6) 关闭监听套接字*/close(listenfd);
}

2,客户端代码

/** client.c
*/#include "config.h"/*readline函数实现*/
ssize_t readline(int fd, char *vptr, size_t maxlen)
{ssize_t n, rc;char    c, *ptr;ptr = vptr;for (n = 1; n < maxlen; n++) {if ( (rc = read(fd, &c,1)) == 1) {*ptr++ = c;if (c == '\n')break;  /* newline is stored, like fgets() */} else if (rc == 0) {*ptr = 0;return(n - 1);  /* EOF, n - 1 bytes were read */} elsereturn(-1);             /* error, errno set by read() */}*ptr = 0;       /* null terminate like fgets() */return(n);
}int main(int argc , char ** argv)
{/*声明套接字和链接服务器地址*/int sockfd;struct sockaddr_in servaddr;/*判断是否为合法输入*/if(argc != 2){perror("usage:tcpcli <IPaddress>");exit(1);}//if/*(1) 创建套接字*/if((sockfd = socket(AF_INET , SOCK_STREAM , 0)) == -1){perror("socket error");exit(1);}//if/*(2) 设置链接服务器地址结构*/bzero(&servaddr , sizeof(servaddr));servaddr.sin_family = AF_INET;servaddr.sin_port = htons(PORT);if(inet_pton(AF_INET , argv[1] , &servaddr.sin_addr) < 0){printf("inet_pton error for %s\n",argv[1]);exit(1);}//if/*(3) 发送链接服务器请求*/if( connect(sockfd , (struct sockaddr *)&servaddr , sizeof(servaddr)) < 0){perror("connect error");exit(1);}//if/*(4) 消息处理*/char sendline[MAX_LINE] , recvline[MAX_LINE];while(fgets(sendline , MAX_LINE , stdin) != NULL){write(sockfd , sendline , strlen(sendline));if(readline(sockfd , recvline , MAX_LINE) == 0){perror("server terminated prematurely");exit(1);}//ifif(fputs(recvline , stdout) == EOF){perror("fputs error");exit(1);}//if}//while/*(5) 关闭套接字*/close(sockfd);
}

3,构建代码

Makefile

all: client serverclient: client.cserver:server.c.PHONY:clean
clean:-rm -f server client

4,效果

启动server:

$./server

启动client:

$./client  10.20.30.40

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【算法】一个简单的整数问题(树状数组、差分)

题目 给定长度为 N 的数列 A&#xff0c;然后输入 M 行操作指令。 第一类指令形如 C l r d&#xff0c;表示把数列中第 l∼r 个数都加 d。 第二类指令形如 Q x&#xff0c;表示询问数列中第 x 个数的值。 对于每个询问&#xff0c;输出一个整数表示答案。 输入格式 第一行…

python爬虫进阶教程之如何正确的使用cookie

文章目录 前言一、获取cookie二、程序实现三、动态获取cookie四、其他关于Python爬虫技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具包②Python实战案例③Python小游戏源码五、面试资料六、Pytho…

day01

1. 找出数组中重复的数字。 在一个长度为 n 的数组 nums 里的所有数字都在 0&#xff5e;n-1 的范围内。数组中某些数字是重复的&#xff0c;但不知道有几个数字重复了&#xff0c;也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。 示例 1&#xff1a; 输入&a…

【问题系列】消费者与MQ连接断开问题解决方案(一)

1. 问题描述 当使用RabbitMQ作为中间件&#xff0c;而消费者为服务时&#xff0c;可能会出现以下情况&#xff1a;在长时间没有消息传递后&#xff0c;消费者与RabbitMQ之间出现连接断开&#xff0c;导致无法处理新消息。解决这一问题的方法是重启Python消费者服务&#xff0c;…

梦极光(ez_re?)

ez_re 先查壳看看&#xff0c;没有壳 32位 我先说说这道题 打开分析找到主函数 在这里就是flag了&#xff0c;用十六进制转ascii码 我们先运行这个程序看看 我想说说我的想法 首先没看出来这里是十六进制转ascii码其次41D538数组用来干啥来的&#xff1f;题目里面给出的请…

Git删除临时分支

愿所有美好如期而遇 软件开发过程中&#xff0c;总有功能要添加进来&#xff0c;当我们有一个功能开发了一半的时候&#xff0c;产品经理说这个功能不需要了&#xff0c;尽管很无奈&#xff0c;但还是要删除&#xff0c;我开发到一半的分支如何删除呢&#xff1f; 所以需要使用…

LeetCode Hot100 84.柱状图中最大的矩形

题目&#xff1a; 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。 求在该柱状图中&#xff0c;能够勾勒出来的矩形的最大面积。 方法&#xff1a; 代码&#xff1a; class Solution {public int largestRectang…

【UE】绘制抛物线并投射物体

效果 步骤 1. 先新建父类为Actor的蓝图&#xff0c;这里命名为“BP_发射物” 打开“BP_发射物”&#xff0c;添加一个球形的静态网格体和一个发射物移动组件 2. 新建一个父类为角色的蓝图&#xff0c;这里命名为“BP_绘制抛物线” 打开“BP_绘制抛物线” 我们希望可以通过控制…

融云筑基,移动云加速构建高性能智能算力底座

自2022年11月以来&#xff0c;全球大模型数量迅速增加&#xff0c;以ChatGPT为代表的大模型已经成为世界数字科技领域新热点。大模型带来的算力需求迅速增长&#xff0c;未来智算场景将会有非常大的突破空间。 在“十四五”规划的指引下&#xff0c;各地政府积极投入智算中心建…

HTTP2

HTTP 确认访问用户身份的认证 某些Web页面只想让特定的人浏览,或者干脆仅本人可见。为达到这个目标,必不可少的就是认证功能。 何为认证 计算机本身无法判断坐在显示器前的使用者的身份。进一步说,也无法确认网络的那头究竟有谁。可见,为了弄清究竟是谁在访问服务器,就…

一种新的基于物理的AlGaN/GaN HFET紧凑模型

标题&#xff1a;A new physics-based compact model for AlGaN/GaN HFETs (IEEE MTT-S International Microwave Symposium) 摘要 摘要 - 针对AlGaN/GaN HFET&#xff0c;提出了一种无拟合参数的物理解析模型。对于非饱和操作&#xff0c;建立了两个接入区和栅极下方I-V特性的…

2023.11.27 关于 Mybatis 增删改操作

目录 引言 增加用户操作 删除用户操作 修改用户操作 阅读下述文章之间 建议点击下方链接先了解 MyBatis 的创建与使用 MyBatis 的创建与使用 建议点击下方链接先了解 单元测试 的创建与使用 Spring Boot 单元测试的创建与使用 引言 为了方便下文实现增、删、改操作我们先…