
s2: 网络编程
涛歌依旧
毕业后就职于华为和腾讯
展开
-
tcp socket 的 recv 如何接收指定长度消息?
有时候,tcp socket一定要接收到指定的字节数才算符合预期,那怎么实现呢?在很多网络编程的书中都有介绍,一起来看看(一直循环接受,达标为止):原创 2022-07-03 23:16:41 · 1812 阅读 · 1 评论 -
自己写了一个telnet命令
大家都知道,linux中有telnet命令,用于探测tcp连接,功能强大。最近,我写了一个这个命令,试了一下,靠谱:经调试,OK.原创 2022-06-19 23:41:05 · 712 阅读 · 1 评论 -
带超时的recv函数
周末了,用纯C/C++写了一个服务端,简单:实现了带超时的recv函数。原创 2022-06-19 23:19:12 · 3244 阅读 · 1 评论 -
Windows上获取网卡的mac地址
最近,搞了一个Windows工具,需要获取网卡mac, 这个太熟悉了,之前也经常玩,搞起:原创 2022-06-12 22:48:17 · 3168 阅读 · 2 评论 -
epoll_wait这么用就对了
平时不仅要多写程序,而且,要多看别人是怎么写程序的,多阅读优秀的源码。最近,对redis源码感兴趣,重点看了一下网络模块,遇到了我熟悉的epoll, 来看一小段程序:static int aeApiPoll(aeEventLoop *eventLoop, struct timeval *tvp) { aeApiState *state = eventLoop->apidata; int retval, numevents = 0; retval = epoll_w原创 2022-05-22 21:45:48 · 1627 阅读 · 0 评论 -
fork了一个多进程并发服务器
大家好,我是涛哥。今天还在假期中,最近被朋友拉进了一个乒乓球群,发现了一个打球的地方,又近又好,球友也多,打得挺好,今年减肥有望啦。有很多读者对网络编程很感兴趣,觉得挺有意思,希望我多写一些网络编程方面的实战例子。没问题,这就来了。我写的这些网络程序例子,都是自己亲自调试过的,大家可以直接拿去运行。在后端开发中,并发服务是一个基本的要求,大家手机上的APP连接到后端服务器,这些服务器是怎样处理成千上万的请求的呢?方法有很多,今天,我们来实战fork一下多进程并发服务器。服务端原创 2022-04-03 23:47:04 · 1149 阅读 · 1 评论 -
漫话Redis源码之七十九
/* Return the current size of the AOF rewrite buffer. */unsigned long aofRewriteBufferSize(void) { listNode *ln; listIter li; unsigned long size = 0; listRewind(server.aof_rewrite_buf_blocks,&li); while((ln = listNext(&li))...原创 2022-02-13 21:44:09 · 479 阅读 · 0 评论 -
写了一个基于select的并发服务器
大家好,我是涛哥。有很多读者对网络编程很感兴趣,觉得挺有意思,希望我多写一些网络编程方面的实战例子。没问题,这就来了。对于后端开发同学而言,肯定了解多线程并发服务器,那么多路复用的并发服务又怎么玩呢?看完这篇就清楚了。今天,我们来实战一下基于select模型的并发服务器,并给出实际实验效果,希望大家能有一些新的认识和收获。如果你还不清楚,那我来手绘一下,你就明白啦:8个男生追求一个女生,这个女生同时处理8个男生的通信请求。服务端实现大家对select函数的作用应该很熟悉了,接原创 2022-02-27 22:08:54 · 900 阅读 · 4 评论 -
腾讯面试:你会求二进制中1的个数吗?
大家好,我是涛哥。今天,我们来看一道腾讯面试题:已知n是一个非负整数,求其二进制中1的个数,要求算法效率尽可能高。这个题目具体什么意思呢?我们假定n = 20,则其二进制为:10100,那么二进制中为1的个数是2个。这道题看似极其简单,但要找到高效的算法并非易事。接下来,我们循序渐进地看具体解法,并做扩展练习。 腾讯滨海大厦夜景常规解法我们可以直接求出n的二进制值,然后...原创 2022-02-13 21:54:33 · 1375 阅读 · 3 评论 -
写了一个聊天软件,带超时的connect功能哦
大家好,我是涛哥。最近,写了一个简单的聊天软件,在局域网内玩得很溜,涉及到网络编程,其中一个场景是要实现超时connect功能。什么意思呢?我来举个例子,你就明白了。一个男孩想追求一个女孩,但这个女孩迟迟不响应,男孩却默默傻傻等待,直到地老天荒。然而,现实情况是,很多男孩耐心有限,最多等三年,过期就不等了。涛哥手绘在网络编程中也是如此,默认情况下,建立TCP连接的connect是阻塞的,如果对方无回应,则会一直等待。那么,怎样才能给connect动作设置超时时间呢?思路是:把sock原创 2022-02-13 21:50:40 · 1049 阅读 · 0 评论 -
漫话Redis源码之十
#include "server.h"/* ----------------- Blocking sockets I/O with timeouts --------------------- *//* Redis performs most of the I/O in a nonblocking way, with the exception * of the SYNC command where the slave does it in a blocking way, and * th...原创 2021-11-21 23:09:38 · 667 阅读 · 0 评论 -
漫话Redis源码之八
if (!(flags & STREAM_RWR_RAWENTRIES)) arraylen_ptr = addReplyDeferredLen(c); streamIteratorStart(&si,s,start,end,rev); while(streamIteratorGetID(&si,&id,&numfields)) { /* Update the group last_id if needed. ...原创 2021-11-21 23:06:31 · 430 阅读 · 0 评论 -
漫话Redis源码之七
void getrangeCommand(client *c) { robj *o; long long start, end; char *str, llbuf[32]; size_t strlen; if (getLongLongFromObjectOrReply(c,c->argv[2],&start,NULL) != C_OK) return; if (getLongLongFromObjectOrReply(...原创 2021-11-21 23:03:43 · 452 阅读 · 0 评论 -
漫话Redis源码之六
/* Return a ziplist element as an SDS string. */sds ziplistGetObject(unsigned char *sptr) { unsigned char *vstr; unsigned int vlen; long long vlong; serverAssert(sptr != NULL); serverAssert(ziplistGet(sptr,&vstr,&vlen,&am...原创 2021-11-21 23:02:18 · 499 阅读 · 0 评论 -
漫话Redis源码之五
void tlsCleanup(void) { if (redis_tls_ctx) { SSL_CTX_free(redis_tls_ctx); redis_tls_ctx = NULL; } if (redis_tls_client_ctx) { SSL_CTX_free(redis_tls_client_ctx); redis_tls_client_ctx = NULL; } #if OPE...原创 2021-11-21 23:00:57 · 746 阅读 · 0 评论 -
写了一个网络聊天软件(Linux版TCP程序)
大家好,我是涛哥。在局域网内写TCP聊天程序,真的很简单。你可以通过TCP和你的女朋友聊天,图示如下: 涛歌手绘然而,如果你的女朋友在别的城市,你想写一个软件跟她聊天,那么上面的图示就不行啦。想一下,这是为什么呢?因为你们都身处在寝室的局域网中,这两个局域网是无法连通的。那怎么办呢?必须借助一个公网将网络打通。为了进行实际验证,我用的是阿里云的机器。这个阿里...原创 2021-11-15 22:26:38 · 1131 阅读 · 0 评论 -
Google浏览器和trie树的那些事儿
大家好,我是涛哥。今天来聊一种重要的数据结构:trie树。大家经常使用google, 当输入搜索内容后,有自动提示的功能,节省了时间。那么,这个自动提示功能是怎样实现的呢?trie树之初见关于搜索的匹配,可以用哈希表,也可以用红黑树,其实,今天要说的trie树更适合这种场景,因为trie树能实现前缀匹配,具有天然的优势。trie树,就是retrieval树,也即检索,名如其实,我们先来看看trie树的数据结构。以"cat", "dog", "cattle", "bag"为例,t.原创 2021-11-15 22:33:37 · 454 阅读 · 0 评论 -
winsock.h中的MAKEWORD宏
什么是WORD? 看看就知道了:typedef unsigned short WORD; 那什么是MAKEWORD宏呢?先看结果:#include #include int main(){ printf("%x\n", MAKEWORD(3, 2)); // 203 return 0;} 再来看看宏定义:#define MA原创 2013-10-27 22:15:47 · 8716 阅读 · 0 评论 -
#include <winsock2.h> #pragma comment(lib, "ws2_32.lib") 与套接字(socket)
winsock2.h是套接字接口, ws2_32.lib是套接字实现。那么什么是套接字呢?套接字就是一个“孔”,应用程序只管网这个“孔”里面插入数据,并从这个“孔”里面取出数据即可。 看看什么是套接字: 应用程序只管与套接字进行数据交互,至于数据是怎么传输的,应用程序就不需要管了。下面再来欣赏一下应用程序与套接字的关系,以此结束本文:原创 2013-10-27 22:01:20 · 18633 阅读 · 5 评论 -
send函数详解
服务端都已经accept了客户端的请求,于是客户端与服务端也就勾搭上了,可以暧昧了,可以发信息了,怎么发送呢?用send函数即可,我们来看看send函数的原型:WINSOCK_API_LINKAGEintWSAAPIsend( SOCKET s, const char FAR * buf, int len, int flags );原创 2013-10-29 21:58:45 · 18849 阅读 · 8 评论 -
recv函数详解
别只顾着send数据啊,你也得接收一些数据啊,来而不往非礼也!如何接收?请看recv函数原型:WINSOCK_API_LINKAGEintWSAAPIrecv( SOCKET s, char FAR * buf, int len, int flags ); 第一个参数表示数据从哪个套接字来,第二个参数是要保存接收数据的地原创 2013-10-29 22:06:32 · 16732 阅读 · 6 评论 -
listen函数详解
套接字与“地方”绑定好了后,对于服务端而言(这里是TCP情况),自然就应该乖乖地去聆听,聆听客户端的需求,否则怎么会叫服务客户呢?如何去聆听呢?很简单,这个单词你早就学过了,那就是listen, 我们来看看listen函数的原型: int PASCAL FAR listen (SOCKET s, int backlog); 第一个参数是服务端套接字,你要聆听,总得出来说个话啊,好,原创 2013-10-28 23:49:31 · 28294 阅读 · 4 评论 -
connect函数详解
不得不说,客户端的connect函数和服务端的accept函数是一对好基友,如果客户端没有去connect, 那么服务端的accept会一直在那里傻傻地痴痴地等待,我们先来看看connect函数的原型吧:WINSOCK_API_LINKAGEintWSAAPIconnect( SOCKET s, const struct sockaddr FAR * name,原创 2013-10-29 22:49:17 · 37977 阅读 · 19 评论 -
WSAStartup函数的用途
我们先来看看WSAStartup函数的原型int PASCAL FAR WSAStartup(WORD wVersionRequired, LPWSADATA lpWSAData); 可以这么理解,第一个参数提供必要信息(为了加载套接字库),第二个参数获取相关信息(获取相关信息)。看看下面的程序就明白了(其中wVersion比较重要): WSACl原创 2013-10-27 23:25:27 · 12868 阅读 · 1 评论 -
closesocket函数和WSACleanup函数
closesocket函数的作用和socket函数的作用相反,释放为套接字分配的资源。 WSACleanup函数和WSAStartup函数的作用相反,终止对套接字库的使用。 用不着多说。原创 2013-10-29 22:37:50 · 12608 阅读 · 1 评论 -
初识fd_set这个结构体
我们先来看看fd_set这个结构体,百度中查得:typedefstruct fd_set { u_int fd_count; socket fd_array[FD_SETSIZE];} fd_set;好,从今以后,我们忘记这个fd_set的具体结构,只需要知道它是一个抽象的结构体即可,在WinSock中,它是不可见的!原创 2014-01-12 23:31:31 · 12778 阅读 · 7 评论 -
127.0.0.1和0.0.0.0
先说0.0.0.0吧, 他是本机上所有IP的集合。 而127.0.0.1是本机的环回地址,我要说,这就是个鸡肋。 假设PC1(client)的IP为192.168.1.105, PC2(server)的IP为192.168.1.106, 现在考虑网络编程。 pc1去连接 127.0.0.1:8888, pc2监听0.0.0.0:8888, 连个鸟啊,原创 2014-03-24 00:07:42 · 16940 阅读 · 0 评论 -
sockaddr和sockaddr_in的区别
sock_addr和sock_addr_in是有区别的,实际上,tamen原创 2014-04-12 22:36:58 · 8316 阅读 · 0 评论 -
要学会写小程序来完成自己想要的功能
斯诺登事件已经曝光, 安全问题原创 2014-08-13 13:35:24 · 8754 阅读 · 2 评论 -
socket函数详解 (有了新的认识)
我们先来看一下socket函数的原型:SOCKET PASCAL FAR socket (int af, int type, int protocol); 典型的调用方式为: unsigned int sockSrv = socket(AF_INET, SOCK_STREAM, 0); 其中:AF_INET指定了地址簇,即TCP/IP协议的套接字原创 2013-10-27 23:40:31 · 13163 阅读 · 3 评论 -
利用gethostname获取主机名
直接上菜:#include#include#pragma comment(lib,"ws2_32.lib") // 静态库 int main(){ WORD v = MAKEWORD(1, 1); WSADATA wsaData; WSAStartup(v, &wsaData); // 加载套接字库 char hostName[100] = {0};原创 2014-12-21 21:54:39 · 8850 阅读 · 8 评论 -
自己写个ping程序玩玩---附带抓包
ping功能很常用, 在Windows/Linux上, 我们经常用ping功能来探测对方是否在线。 那么, ping到底是怎么实现的呢? 在本文中, 我们自己来写一个ping, 当然, 功能肯定没有Windows/Linux自带的ping那么强大。 但是, 自己写写, 可以理解更深刻。 说明, 为了简便起见, 程序中的众多异常, 我就不考虑了, 只聚焦主要功能。原创 2015-02-01 18:59:44 · 12447 阅读 · 2 评论 -
如何获取网卡的数目?---利用GetNumberOfInterfaces
下面, 我们来看看如何获取网卡数目。 如果你在编译的时候出现问题, 请到我的博客资源中下载对应的文件和库。 简单的一碟菜如下:#include #include #include // 如果没有这个, 请在我的博客资源中下载#pragma comment(lib, "iphlpapi.lib") int main(){ unsigned long nu原创 2015-02-04 23:00:44 · 8257 阅读 · 8 评论 -
小议TCP带外数据(OOB--out of band)
首先要说明的是: udp没有带外数据, 而tcp有。 下面, 我们来聊聊tcp带外数据。 当客户端和服务端建立了tcp连接之后, 我们可以说, 建立了一个tcp通道, 于是乎, 数据可以在这个通道上奔波。 这个tcp通道又可以叫做tcp通带, 总之就是一条道路。 带是什么? 如果你还不明白, 那你就把你的裤带解开, 然后把裤带拉直, 看到了吧, 带就是一条路, 一个通道。原创 2015-01-23 00:21:32 · 10142 阅读 · 2 评论 -
《Windows Sockets 网络编程》. Bob Quinn & Dave Shuttle (非常实用的Windows编程书籍)
历时一年多, 终于相对认真且完整地把Bob Quinn和Dave Shuttle的名著Windows Sockets 这本书学了一遍(实际上有的章节学过好几遍), 受益较多。 以后就把这本书当做自己案头参考书, 有空的时候, 要随时再阅读一些, 有不懂的, 要再回来参考。 虽然是1995年写的, 但到现在,书还是很权威的, 足见分量。 作者毕竟是WinSock的相关开发人员原创 2015-04-12 17:25:41 · 9799 阅读 · 2 评论 -
某哥一句话点醒我什么是网络编程------不过就是读写文件而已(大道至简)
上次我跟某哥说,我对网络编程不太熟悉,结果他说: “网络编程很简单:在学校里写程序,你把数据写入文件,从文件中读取数据; 在公司里写程序,你把数据写入socket, 从socket中读取数据。两者道理是一样的!”原创 2013-10-29 22:59:10 · 9470 阅读 · 4 评论 -
bind函数详解
前面我们已经说了, 套接字也创建了, “地方”也定义了,下面就需要将socket放置在这个“地方”(TCP),将他们紧紧地捆绑在一起,用bind函数吧, 我们来看看函数原型:int PASCAL FAR bind (SOCKET s, const struct sockaddr FAR *addr, int namelen); 第一个参数当然是待绑定的套接字啦,第二个参数是标识绑定原创 2013-10-28 23:33:45 · 38971 阅读 · 0 评论 -
如何用C程序获取www.baidu.com的ip地址?---实际是请求dns server解析
怎样用C程序获取www.baidu.com的ip地址呢? 实际上, 这个问题我们之前间接讨论过, 今天我们继续来说一下。 当然啦, 你得配dns地址, 也就是要指定dns服务器, 否则, 怎么能解析www.baidu.com呢? 当然了, 你可以直接ping www.baidu.com获取, 结果如下:C:\Documents and Settings\Adminis原创 2015-04-27 23:03:51 · 10489 阅读 · 0 评论 -
accept函数详解
既然服务端已经很虔诚了,很真诚了,处于倾听状态,那么该是去尝试接受客户端请求的时候了,别只顾着倾听,不去接纳别人。接纳客户端请求的函数是accept, 我们先来看看函数的原型:WINSOCK_API_LINKAGESOCKETWSAAPIaccept( SOCKET s, struct sockaddr FAR * addr, int FAR * ad原创 2013-10-29 00:08:47 · 79096 阅读 · 35 评论 -
inet_ntoa之坑------再谈不可重入函数中的static
不想用过多的话语来啰嗦, 还是看代码吧(如下结果非常让人吃惊):#include #include #include #include #include int main(){ unsigned long n1 = inet_addr("10.213.120.1"); unsigned long n2 = inet_add原创 2016-04-09 19:31:09 · 11145 阅读 · 2 评论