渭南建網(wǎng)站seo首頁(yè)關(guān)鍵詞優(yōu)化
過(guò)去的一年
? ? ? ? 沒(méi)有注意加入csdn已經(jīng)有一年了。 這幾天翻看小猴兒的通知才發(fā)現(xiàn)時(shí)間來(lái)到了一年的紀(jì)念日。稍稍思索想要將這一段時(shí)間的學(xué)習(xí)到的知識(shí)以及偶然遇到的機(jī)遇做一下總結(jié)。
? ? ? ? 上一次寫(xiě)紀(jì)念日是來(lái)到csdn128天的時(shí)候, 200天前我的學(xué)習(xí)狀態(tài)是非常瘋狂的。 只記得我當(dāng)時(shí)兩個(gè)月的時(shí)間就跟著網(wǎng)課學(xué)完了數(shù)據(jù)結(jié)構(gòu)和c++。學(xué)習(xí)c++和數(shù)據(jù)結(jié)構(gòu)是很有意思的, 跟著網(wǎng)課學(xué)習(xí)完一節(jié)課, 我就將對(duì)應(yīng)的代碼敲出來(lái), h文件一個(gè)接著一個(gè)的開(kāi),反復(fù)的敲, 基本上每一種數(shù)據(jù)結(jié)構(gòu)我都能敲三四遍。?還記得當(dāng)時(shí)我有一個(gè)c++源文件里面有一萬(wàn)多行代碼, 后來(lái)被我不小心刪掉了, 我只在gitee上面找回了四五千行, 這讓我心痛了好一陣。?
????????c++和數(shù)據(jù)結(jié)構(gòu)是有意思的, 但是linux是沒(méi)意思的。 c++學(xué)習(xí)完之后, 我學(xué)了linux, 同樣看的網(wǎng)課。 linux的網(wǎng)課老師講的很好。 我能看出來(lái)老師已經(jīng)盡量將linux講的有意思, 講的生動(dòng)。?但是很可惜, linux作為計(jì)算機(jī)世界的哲學(xué), 它有著將課堂的趣味性一減再減的魔力, 讓我看著看著就走神了。 沒(méi)辦法, 我只能重新點(diǎn)擊鍵盤(pán)左方向鍵——重新看一遍。你說(shuō)linux你學(xué)的很快?好吧, 可能是我學(xué)習(xí)的積極性有所下降。 也確實(shí), 我的學(xué)習(xí)積極性當(dāng)時(shí)是有所下降的?!?月份的天氣太熱, 讓我不自覺(jué)打開(kāi)冰箱拿出一個(gè)冰棍,吃一口的同時(shí)再打開(kāi)手機(jī)刷一下視頻, 然后碎片化的時(shí)間不允許我的學(xué)習(xí)效率提高上去。 結(jié)果就是,我從7月份到10月份linux只學(xué)習(xí)完系統(tǒng)編程。但是!?當(dāng)我看著我身邊的同學(xué)們連操作系統(tǒng)是啥都不知道的時(shí)候, 原諒我的嘴角抽動(dòng)了一下。 我知道這不對(duì),我學(xué)校的課都沒(méi)學(xué),用學(xué)習(xí)學(xué)校線(xiàn)代, 英語(yǔ)這種基石學(xué)科的時(shí)間學(xué)習(xí)來(lái)學(xué)習(xí)專(zhuān)業(yè)課, 好像并不足以我感到有那一絲優(yōu)越感。
????????所以我學(xué)習(xí)線(xiàn)代了,所以我學(xué)習(xí)英語(yǔ)了。 ——我上課不拿電腦了, 可能老師們上課的時(shí)候會(huì)發(fā)現(xiàn)課堂上少了那一個(gè)在最后一排拿電腦上課的同學(xué)。他們會(huì)想是不是這個(gè)同學(xué)更過(guò)分不來(lái)上課了? 所以他們簽到的勁頭更足,他們變著花樣簽到, 甚至發(fā)了簽到卻在課堂上說(shuō)不讓我們簽。那些在宿舍睡大覺(jué)的人可能起來(lái)的時(shí)候一看到簽到了, 一下子就簽了, 可憐的倒霉鬼不知道的是老師在課堂上預(yù)判了他的操作。 但是任老師花樣百出, 我上課了!我在學(xué)習(xí)線(xiàn)代!我在學(xué)習(xí)英語(yǔ)!四級(jí)通過(guò)的大門(mén)我來(lái)了!機(jī)器學(xué)習(xí)房間的門(mén)檻你即便高我也在接近你。?AI大模型他們說(shuō)需要機(jī)器學(xué)習(xí)的功底,b站上面的機(jī)器學(xué)習(xí)課程帶著英語(yǔ)的講解讓我著迷, 這些成為了我想要學(xué)習(xí)線(xiàn)代和英語(yǔ)的無(wú)限動(dòng)力! linux的網(wǎng)絡(luò)編程別擔(dān)心, 我馬上就會(huì)重新學(xué)你。 mysql數(shù)據(jù)庫(kù)你別得意, 你快被我學(xué)完啦。?早晨的腦子累只是一下子, 算法一道題過(guò)后讓我清醒。AI你別躲藏, 機(jī)器學(xué)習(xí)我遲早學(xué)習(xí)你。這么多東西, 這么多知識(shí)。還是太菜了。但是!菜就多練。
所得收獲
? ? ? ? 在csdn創(chuàng)作的收獲是無(wú)窮無(wú)盡的, 粉絲、?閱讀量的增長(zhǎng)與ip的維護(hù)是一方面。 認(rèn)識(shí)同道的大佬更是一個(gè)能鞭策自己不輟修行, 給自己指引方向的明燈。 所以,在csdn創(chuàng)作已經(jīng)是收獲,其他更是受益匪淺。?
成就
? ? ? ? 在過(guò)去寫(xiě)的最好的一段代碼可能就是在網(wǎng)絡(luò)編程寫(xiě)的客戶(hù)端和服務(wù)端代碼,網(wǎng)絡(luò)編程真的讓人感覺(jué)不可思議, 我在測(cè)試的時(shí)候甚至讓我的服務(wù)器和window系統(tǒng)連接通信!下面是tcp協(xié)議的服務(wù)端代碼:
//server:#pragma once
#include "Log.hpp"
#include <iostream>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include "ThreadPool.hpp"
#include "Task.hpp"
#include <sys/wait.h>
#include <unistd.h>
#include"daemon.hpp" using namespace std;const int defaultfd = -1;
const int defaultport = 8080;
const string defaultip = "0.0.0.0";
const int backlog = 10; // 直接用,一般不要設(shè)置的太大。class TcpServer; // 聲明class ThreadData
{
public:ThreadData(int fd, string ip, uint16_t port, TcpServer *const t): sockfd_(fd), clientip_(ip), clientport_(port), t_(t){}public:int sockfd_;string clientip_;uint16_t clientport_;public:TcpServer *const t_;
};Log lg;enum
{SockError = 2,BindError,ListenError
};class TcpServer
{
public:TcpServer(int port = defaultport, string ip = defaultip, int sockfd = defaultfd): listensockfd_(sockfd), ip_(ip), port_(port){}void InitServer(){listensockfd_ = socket(AF_INET, SOCK_STREAM, 0);if (listensockfd_ < 0){lg(Fatal, "create socket, errno: %d, strerror: %s", errno, strerror(errno));exit(SockError);}//lg(Info, "create socket success, sockfd: %d", listensockfd_);struct sockaddr_in local;memset(&local, 0, sizeof(local));local.sin_family = AF_INET;local.sin_port = htons(port_);inet_aton(ip_.c_str(), &(local.sin_addr)); // 主機(jī)序列轉(zhuǎn)網(wǎng)絡(luò)學(xué)列。 inet_aton是一個(gè)線(xiàn)程安全的函數(shù)。// 綁定if (bind(listensockfd_, (sockaddr *)&local, sizeof(local)) < 0){lg(Fatal, "bind error, errno: %d, strerror: %s", errno, strerror(errno));exit(BindError);}// tcp面向字節(jié)流, 是被動(dòng)的, 所以要將對(duì)應(yīng)的socket設(shè)置為監(jiān)聽(tīng)狀態(tài)。if (listen(listensockfd_, backlog) < 0) // backlock表示的是底層全連接隊(duì)列的長(zhǎng)度。 這個(gè)參數(shù)對(duì)意思, 不做解釋。{lg(Fatal, "Listen error, errno: %d, strerror: %s", errno, strerror(errno));exit(ListenError);}lg(Info, "Listen has success");}void Start(){Daemon();ThreadPool<Task>::GetInstance()->Start();lg(Info, "tcpServer is running...");for (;;) // tcp協(xié)議也是一種一直處于運(yùn)行的服務(wù){(diào)// tcp是面向連接的, 所以他比udp還多了一步accept, 先將客戶(hù)端與服務(wù)端連接起來(lái)。accept的返回值成功返回整數(shù)文件描述符,否則-1被返回, 錯(cuò)誤碼被設(shè)置// 1、獲取新連接,struct sockaddr_in client; // 獲取的是客戶(hù)端的addrsocklen_t len = sizeof(client);int sockfd = accept(listensockfd_, (sockaddr *)&client, &len); // accept成功, 就能知道是誰(shuí)連接的我。if (sockfd < 0) // 關(guān)于這兩個(gè)套接字, sockfd_的核心工作就只是把鏈接獲取上來(lái), 未來(lái)進(jìn)行IO操作, 看的是sockfd。{lg(Waring, "listen error, errno: %d, strerror: %s", errno, strerror(errno));continue;}uint16_t clientport = ntohs(client.sin_port); // 網(wǎng)絡(luò)序列轉(zhuǎn)主機(jī)序列char clientip[32];inet_ntop(sockfd, &client.sin_addr, clientip, sizeof(clientip));// 2、根據(jù)新連接進(jìn)行通信lg(Info, "get a new link..., sockfd:%d, clientport: %d, clientip: %s", sockfd, clientport, clientip);// version--4線(xiàn)程池版本Task task_(sockfd, clientip, clientport);ThreadPool<Task>::GetInstance()->Push(task_);}}~TcpServer(){}private:int listensockfd_; // 監(jiān)聽(tīng)套接字, 只用來(lái)升起服務(wù)器, 接收鏈接uint16_t port_;string ip_;
};
憧憬
? ? ? ? 憧憬有很多, 但是看不清的也有很多。 有點(diǎn)憧憬與迷茫交織, 有的則是沖突。 簡(jiǎn)單的, 最近的就是能夠在學(xué)期內(nèi)學(xué)習(xí)完linux, 把線(xiàn)代和英語(yǔ)學(xué)好吧。?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ——2024-11-26