C++網絡編程——實現一個簡單的echo服務器

在前面講完了服務器從建立套接字、綁定、監聽和提取,以及客戶端的連接,我們已經可以動手實現一個簡單的鏡像服務器。

錯誤處理

在那之前,我們先封裝一個錯誤處理函數 errif

可以定義一個uitl.cpp放里面,需要的地方引用即可

util.h

#ifndef UTIL_H
#define UTIL_H
?
void errif(bool, const char*);
?
#endif

util.cpp

#include "util.h"
#include <stdio.h>
#include <stdlib.h>
?
void errif(bool condition, const char *errmsg){if(condition){perror(errmsg);exit(EXIT_FAILURE);}
}

服務端代碼

server.cpp

#include<stdio.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<string.h>
#include<unistd.h>
#include "util.h"
?
int main(){int socketfd = socket(AF_INET,SOCK_STREAM,0);errif(sockfd == -1 "socket crete error");struct sockaddr_in serv_addr;bzero(&serv_addr,sizeof(serv_addr));serv_addr.sin_family = AF_INET;serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1");serv_addr.sin_port = htons(8888);errif(bind(sockfd,(sockaddr*)&serv_addr,sizeof(serv_addr)) == -1,"socket bind error");errif(listen(sockfd,SOMAXCONN) == -1,"socket listen error");struct sockaddr_in clnt_addr;socklen_t clnt_addr_len = sizeof(clnt_addr);bzero(&clnt_addr,sizeof(clnt_addr));int clnt_sockfd = accept(sockfd,(sockaddr*)&clnt_addr,&clnt_addr_len);errif(clnt_sockfd == -1,"socket accept error");printf("new client fd %d! IP:%s Port:%d\n",clnt_sockfd,inet_ntoa(clnt_addr.sin_addr),ntohs(clnt_addr.sin_port));//讀寫while (true) {char buf[1024];bzero(&buf,sizeof(buf));ssize_t read_bytes = read(clnt_sockfd,buf,sizeof(buf));if(read_bytes > 0){printf("message from client fd %d:%s",clnt_sockfd,buf);write(clnt_sockfd,buf,sizeof(buf));}else if(read_bytes == 0){printf("client fd %d disconnected\n",clnt_sockfd);close(clnt_sockfd);break;}else{close(clnt_sockfd);errif(true,"socket read error");}}close(sockfd);return 0;
}

客戶端代碼

client.cpp

#include <iostream>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <string.h>
#include <unistd.h>
#include "util.h"
?
int main(){int sockfd = socket(AF_INET,SOCK_STREAM,0);errif(sockfd == -1 "socket create error");struct sockaddr_in serv_addr;bzero(&serv_addr,sizeof(serv_addr));serv_addr.sin_family = AF_INET;serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1");serv_addr.sin_port = htons(8888);errif(connect(sockfd,(sockaddr*)&serv_addr,sizeof(serv_addr)) == -1,"socket connect error");while(true){char buf[1024];bzero(&buf,sizeof(buf));scanf("%s",buf);ssize_t write_bytes = write(sockfd,buf,sizeof(buf));if(write_bytes == -1){printf("socket already disconnected, can't write any more!\n");break;}bzero(&buf,sizeof(buf));ssize_t read_bytes = read(sockfd,buf,sizeof(buf));if(read_bytes > 0){printf("message from server:%s",buf);}else if(read_bytes == 0){printf("server socket disconnected\n");break;}else{errif(true, "socket read error");break;}}close(sockfd);return 0;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/17914.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/17914.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/17914.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

藍橋杯Web開發【大學組:國賽】2022年真題

1.分一分 如果給你一個數組&#xff0c;你能很快將它分割成指定長度的若干份嗎&#xff1f; 1.1 題目問題 請在 js/index.js 文件中補全函數 splitArray 中的代碼&#xff0c;最終返回按指定長度分割的數組。 具體要求如下&#xff1a; 將待分割的&#xff08;一維&#x…

云WAF如何適應動態變化的網絡安全威脅

云WAF&#xff08;Web Application Firewall&#xff09;是一種專門用于保護Web應用程序的安全系統&#xff0c;它能夠實時監測并分析網絡流量&#xff0c;一旦發現潛在攻擊行為立即進行阻斷&#xff0c;有效防止各類Web應用層攻擊。云WAF的適應性主要體現在以下幾個方面&#…

【Docker故障處理篇】運行容器報錯“docker: failed to register layer...file exists.”解決方法

【Docker故障處理篇】運行容器報錯“docker: failed to register layer...file exists.” 一、Docker環境介紹2.1 本次環境介紹2.2 本次實踐介紹二、故障現象2.1 運行容器消失2.2 重新運行容器報錯三、故障分析四、故障處理4.1 停止 Docker 服務:4.2 備份重要數據4.3 清理沖突…

從了解到掌握 Spark 計算框架(一)Spark 簡介與基礎概念

文章目錄 什么是 Spark&#xff1f;核心特點 Spark 對比 MapReduceSpark 編程模型RDDDataFrameDataset Spark 運行模式Spark 生態 什么是 Spark&#xff1f; Spark 是一個基于內存的分布式計算框架&#xff0c;最初由加州大學伯克利分校的 AMPLab 開發&#xff0c;后來捐贈給了…

go語言基準測試Benchmark 最佳實踐-冒泡排序和快速排序算法基準測試時間復雜度對比

在go語言中Benchmark基準測試( 在后綴為_test.go的文件中&#xff0c;函數原型為 func BenchmarkXxx(b *testing.B) {}的函數 )可以用來幫助我們發現代碼的性能和瓶頸&#xff0c; 其最佳實踐 應該是我們最常用的 冒泡排序和快速排序的測試了&#xff0c;廢話不說&#xff0c;直…

【MySQL精通之路】InnoDB(9)-表和頁壓縮(2)-頁壓縮

目錄 1.支持的平臺 2.頁面壓縮的工作原理 3.啟用頁面壓縮 4.禁用頁面壓縮 5.頁面壓縮-元數據 6.使用頁面壓縮識別表 7.頁面壓縮限制和使用說明 InnoDB支持對駐留在FPT表空間中的表進行頁面級壓縮。 此功能被稱為透明頁面壓縮。通過使用CREATE TABLE或ALTER TABLE指定COM…

項目9-網頁聊天室3(主界面之用戶信息)

1.前端頁面 CSS: 如何讓img里的圖片自適應div&#xff0c;且不變形_img自適應div大小 鋪滿且不變形-CSDN博客 JavaScript/jQuery 如何改變一個img元素的src屬性|極客教程 (geek-docs.com) 2.要求 左上角顯示用戶的昵稱和頭像. 3.后端代碼 3.1 添加攔截器 3.2 注冊攔截器 …

關于C++的類型轉換一篇搞掂

類型轉換 本篇主要探討C11的新出現的類型轉換方式 隱式類型轉換(意義相近的類型可轉換) 顯示類型轉換(意義不相近的類型需強制類型轉換) C為了加強類型轉換的可視性, 引入了四種命名強制類型轉換操作符 但同時也兼容了C語言之前的類型轉換和強制類型轉換, 只是提供了規范的轉…

go升級后 編譯的exe在win7上無法正常運行

D:/Go/src/runtime/sys_windows_amd64.s:65 x75 fpx22fca sp-0x22fc8日 升級到go 1.21后報一堆錯誤&#xff0c;要死了啊 原來是go 1.21不支持win7了&#xff0c;必須把go退回到1.20版本 谷歌發布編程語言 Go 1.21 版本&#xff1a;取消支持微軟 Win7/8 及蘋果 macOS 10.13/10…

pip install pytorch-quantization error

一 報錯信息 最近安裝pytorch-quantization報錯&#xff0c;安裝失敗報錯信息如下&#xff1a; Looking in indexes: https://pypi.org/simple, https://pypi.ngc.nvidia.com Collecting pytorch-quantizationDownloading pytorch-quantization-2.2.1.tar.gz (6.8 kB)Prepari…

Alibaba Cloud Linux 安裝docker

阿里云實例基于 Red Hat 的發行版&#xff08;例如 CentOS 或 Alibaba Cloud Linux&#xff09;。在這種情況下&#xff0c;應該使用 yum 或 dnf 包管理器&#xff0c;而不是 apt。以下是如何在 CentOS 或類似系統上安裝 Docker 的步驟&#xff1a; 1. 更新系統 首先&#xf…

網絡滲透思考

1. windows登錄的明文密碼&#xff0c;存儲過程是怎么樣的&#xff0c;密文存在哪個文件下&#xff0c;該文件是否可以打開&#xff0c;并且查看到密文 windows的明文密碼:是通過LSA&#xff08;Local Security Authority&#xff09;進行存儲加密的 存儲過程:當用戶輸入密碼之…

用C語言實現掃雷

本篇適用于C語言初學者&#xff0c;主要涉及對于函數&#xff0c;數組&#xff0c;分支循環的運用。 目錄 設計思想&#xff1a; 總代碼&#xff08;改進后&#xff09;&#xff1a; 運行結果展示&#xff1a; 分布介紹&#xff1a; 聲明&#xff1a; 代碼主體部分&#…

Vue3學習使用axios和qs進行POST請求和響應處理

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 一、前言1.準備工作2.發送POST請求3.處理響應數據4.總結 一、前言 在前端開發中&#xff0c;經常需要與后端進行數據交互&#xff0c;其中包括發送POST請求并處理響…

Docker - Kafka

博文目錄 文章目錄 說明命令 說明 Docker Hub - bitnami/kafka Docker Hub - apache/kafka Kafka QuickStart Kafka 目前沒有官方鏡像, 目前拉取次數最多的 bitnami/kafka, Apache 提供的是 apache/kafka, 本文使用 bitnami/kafka 數據卷數據卷印射在容器內的路徑kafka/bitna…

HarmonyOS 鴻蒙應用開發 - 創建自定義組件

開發者定義的稱為自定義組件。在進行 UI 界面開發時&#xff0c;通常不是簡單的將系統組件進行組合使用&#xff0c;而是需要考慮代碼可復用性、業務邏輯與UI分離&#xff0c;后續版本演進等因素。因此&#xff0c;將UI和部分業務邏輯封裝成自定義組件是不可或缺的能力。 1、創…

快團團幫賣團長怎么對供貨大團長進行評分?

都說幫賣“躺賺”&#xff1f; 一旦遇團不淑&#xff0c;慘遭不靠譜團長挖坑&#xff0c;售后拖延、發貨慢、產品瑕疵…… 加上顧客奪命連環催&#xff0c;雙面夾擊&#xff0c;夾縫生存。供貨團長靠不靠譜太重要了&#xff01; 快團團供貨團長評分系統上線&#xff01; 幫賣團…

【神經網絡優化的策略有哪些???】

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 前言一、神經網絡優化策略總結 前言 神經網絡優化是深度學習中至關重要的一部分&#xff0c;它涉及到調整神經網絡參數以最小化損失函數。 以下是一些常見的神經網…

ECOLOGY9解決明細表數據按需顯示或隱藏

ECOLOGY9:由于領導需要查看完整的明細表數據&#xff0c;沒有啟用分頁功能&#xff0c;導致大領導查看時又出現幾百行的數據&#xff0c;影響使用體驗。需求&#xff1a;只看正常表單數據&#xff0c;明細表數據&#xff0c;默認不顯示&#xff0c;需要查看時再打開。 實現&am…

2024年華為OD機試真題-火星文計算-C++-OD統一考試(C卷D卷)

題目描述: 已知火星人使用的運算符為#、$,其與地球人的等價公式如下: x#y = 4*x+3*y+2 x$y = 2*x+y+3 1、其中x、y是無符號整數 2、地球人公式按C語言規則計算 3、火星人公式中,#的優先級高于$,相同的運算符,按從左到右的順序計算 現有一段火星人的字符串報文,請…