socket 一个完整的不错的示例

news2024/11/18 11:43:33

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

检测环境常用,备份一下

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_echo
                        ssize_t n;
                        char buff[MAX_LINE];
                        while((n = read(connfd , buff , MAX_LINE)) > 0)
                        {
                                write(connfd , buff , n);
                                printf("rec: %s", buff);
                        }
                        exit(0);
                }//if
                close(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 */
                } else
                        return(-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);
                }//if

                if(fputs(recvline , stdout) == EOF)
                {
                        perror("fputs error");
                        exit(1);
                }//if
        }//while

        /*(5) 关闭套接字*/
        close(sockfd);
}

3,构建代码

Makefile

all: client server

client: client.c

server:server.c

.PHONY:clean
clean:
        -rm -f server client

4,效果

启动server:

$./server

启动client:

$./client  10.20.30.40

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android中的多进程

在Android中也可以像pc一样开启多进程&#xff0c;这在android的编程中通常是比较少见的&#xff0c;以为在一个app基本上都是单进程工作就已经足够了&#xff0c;有一些特殊的场景&#xff0c;我们需要用多进程来做一些额外的工作&#xff0c;比如下载工作等。 在Android的An…

UI上传组件异步上传更改为同步

实现异步方法 JavaScript 异步 实现异步的五种实现方法_js异步-CSDN博客 这两种比较经常用。 因为上传组件是异步上传的通过Async和await配合使用可以上传完照片视频后返回的地址在继续走下去&#xff0c;而不是图片视频地址还未获取时就上传后端了。

leetcode算法之字符串

目录 1.最长公共前缀2.最长回文子串3.二进制求和4.字符串相乘 1.最长公共前缀 最长公共前缀 class Solution { public:string longestCommonPrefix(vector<string>& strs) {//法一&#xff1a;两两比较string ret strs[0];for(int i1;i<strs.size();i){ret f…

[栈溢出+参数跟踪] [ZJCTF 2019]Login

题目来源 buuctf——[ZJCTF 2019]Login 本题主要考察参数溯源的能力。 参考链接 https://zhuanlan.zhihu.com/p/570607303 题目信息 64位&#xff0c;ubuntu16&#xff0c;开了金丝雀 C风格的代码&#xff0c;并且将admin登录信息写入代码中。 溢出点不在这里&#xff0c;但是…

井盖倾斜怎么办?智能井盖传感器监测方法

井盖倾斜是一个紧迫的问题&#xff0c;如果不及时处理可能会导致道路安全性下降&#xff0c;进而增加车辆和行人发生意外的风险。为应对这一问题现已开发出智能井盖传感器&#xff0c;它可以持续监测井盖的状态&#xff0c;一旦发现倾斜等异常情况会立即发出警报。 在智慧城市的…

揭秘:软件测试中Web请求的完整流程!

在软件开发的过程中&#xff0c;测试是一个至关重要的环节。而在现代互联网应用中&#xff0c;Web请求是很常见的一个测试需求。本文将介绍Web请求的完整测试流程&#xff0c;帮助读者更好地理解软件测试的关键步骤。 一、测试准备阶段 在进行Web请求测试之前&#xff0c;测试…

【C】语言 sizeof和strlen的对比

目录 sizeof和strlen的对比 1.1 sizeof 1.2 strlen strlen的模拟实现 strlen介绍 1.3 sizeof 和 strlen的对比 sizeof和strlen的对比 1.1 sizeof 在学习操作符的时候&#xff0c;我们学习了 sizeof &#xff0c; sizeof 计算变量所占内存内存空间⼤⼩的&#xff0c;…

我试图通过这篇文章告诉你,什么是神奇的泛化调用。

关于 RPC 调用&#xff0c;大家肯定都是比较熟悉的了&#xff0c;就是在微服务架构下解决系统间通信问题的一个玩意。 其中的典型代表之一就是 Dubbo 了&#xff1a; 在微服务架构下&#xff0c;我们针对某个 RPC 接口&#xff0c;我们一般有两个角色。 服务消费者 (Dubbo Con…

【前端首屏加载速度优化(0): 谷歌浏览器时间参数】

DOMContentLoaded 浏览器已经完全加载了 HTML&#xff0c;DOM树构建完成&#xff0c;但是像是 <img> 和样式表等外部资源可能并没有下载完毕。 Load DOM树构建完成后&#xff0c;继续加载 html/css 中的外部资源&#xff0c;加载完成之后&#xff0c;视为页面加载完成。…

继电保护-变压器纵联差动保护MATLAB仿真模型

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 原理概述 差动保护是在两端设置的保护&#xff0c;通过比较两端测回来的电气量&#xff0c;进而看是否需要动作&#xff0c;纵联差动保护是变压器主保护。 纵联差动保护基本原则 双绕组变压器实现纵联差动…

java反射和注解2-自定义注解

对反射有一定了解过后学习注解就会轻松许多&#xff0c;这篇文章会创建创建字段&#xff0c;方法&#xff0c;参数上面的注解&#xff0c;并且通过反射的形式将注解内容拿出来。 下面是自定义注解的简短讲解 1&#xff0c;自定义注解&#xff0c;创建一个只能修饰方法的注解 …

【外汇天眼】概率之道:规则交易背后的心态与风险控制

交易的结果&#xff0c;无外乎盈利和亏损。 对于这些结果&#xff0c;我们的心态管理很重要、很重要&#xff01; 这涉及到“保住江山”和“东山再起”。 先来说说交易盈利的结果 当一个人能够稳定盈利的时候&#xff0c;很容易产生自我麻痹、忘乎所以的飘飘然心态&#xff0…

C++基础 -9- 函数的默认参数

函数默认格式(图片代码段呈现) #include "iostream"using namespace std;void rlxy(int a100) {cout << a << endl; }int main() {rlxy();rlxy(99); }函数默认参数注意事项 函数的默认参数从左开始推导 错误写法 正确写法

一篇学会cron表达式

1、定义 Cron表达式是一种用于定义定时任务的格式化字符串。它被广泛用于Unix、Linux和类Unix系统中&#xff0c;用于在指定的时间执行预定的任务。Cron表达式由6个字段组成&#xff0c;每个字段通过空格分隔开。 在本文中&#xff0c;我们将学习如何理解和编写Cron表达式。 C…

高防服务器和高防CDN的区别是什么?

现今大环境下攻击问题愈发严峻&#xff0c;许多网站有遇到被攻击导致网站崩溃&#xff0c;资源消耗的问题&#xff0c;那么这时候高防就是给为站长&#xff0c;企业等的第一选择了&#xff0c;那边目前高防CDN和高防服务器这两种抵御DDoS攻击的两种主流防御&#xff0c;那种会更…

有趣的代码——猜数字游戏的实现

前面介绍过很多的C语言常识&#xff0c;但是我们都知道“兴趣是最好的老师”&#xff0c;所以&#xff0c;今天我们用之前讲过的一些知识&#xff0c;加上部分新补充的知识点&#xff0c;写一个“猜数字”的小游戏&#xff0c;来丰富我们的编程学习生活&#xff0c;感受来自C语…

win系列:电脑设置关闭屏幕和休眠时间不起作用解决方案

电脑设置关闭屏幕和休眠时间不起作用解决方案 一. 笔记本电脑30s自动锁屏&#xff0c;怎么设置都没用?方法一&#xff1a;使用快捷键方法二&#xff1a;开始菜单设置如果需要对锁屏进行背景等的设置&#xff0c;建议你采用这个方法来进行。方法三&#xff1a;控制面板设置怎么…

高等数学零基础篇复习笔记

预备章 零基础高等数学入门知识 第一节 集合、运算与关系 第二节 三角函数与反三角函数 三角函数的公式 反三角函数 第三节 常见不等式及数列 划重点 第一章 函数、极限与连续 第一节 函数及函数的初等特性 特殊函数 反函数 函数的初等特性 ①有界性 ②奇偶性 偶函数图像…

面向对象基础小结

面向对象基础小结 面向对象和面向过程的区别 两者的主要区别在于解决问题的方式不同&#xff1a; 面向过程&#xff1a;是把解决问题的过程拆成一个个方法&#xff0c;通过一个个方法的执行解决问题。面向对象&#xff1a;会先抽象出对象&#xff0c;然后用对象执行方法的方…

03 项目运行

前面两篇文章对项目架构+源码架构做了分析,这篇文章先将服务部署一下,能够让大家有个直观的感受。 组件资源 项目运行的各种组件已经为你准备好了,有需要的直接百度云盘下载: 链接:https://pan.baidu.com/s/1hN6qf20gamMHPmA_qXwsLg提取码:o4k9MySQL数据库创建 找到的…