精华内容
下载资源
问答
  • Epoll实现Web服务器 文章目录Epoll实现Web服务器项目概述:代码...本项目主要是对黑马linux网络编程中的Web服务器进行复现以及总结,项目主要功能是 在本地运行服务器代码后,利用浏览器可以访问服务器上的文件.项目结果如

    Epoll实现Web服务器

    项目概述:

      本项目主要是对黑马linux网络编程中的Web服务器进行复现以及总结,项目主要功能是 在本地运行服务器代码后,利用浏览器可以访问服务器上的文件.项目结果如下图所示:
    浏览器读取目录浏览器读取单个图片

    代码流程图

    在这里插入图片描述
      在main函数中,首先是对输入参数格式进行判断, 即在执行调用命令的时候,必须加上端口号以及要访问的根目录.接着在主函数中只要是执行epoll-run函数,而epoll run函数也是整个代码的逻辑核心.
      在epoll-run 函数中,首先是创建epoll监听树, 然后调用init-listen-fd函数创建监听节点,并将其挂到监听树上.然后在一个死循环中, 利用epoll-wait函数阻塞监听前面创建的监听树,如果发现有新的节点返回,则需要判断新的节点是监听节点(listenfd), 还是已经挂到监听树上的节点发来数据(cfd).
    如果是listenfd,则调用do_accept函数创建用于与浏览器端通信的cfd, 并将其挂到监听树上.
    如果是cfd, 则需要解析http协议,取出要访问的文件, 将对应的文件或者目录传回到浏览器端.

    主要模块分析

    1. init-listen-fd函数

    此函数的主要目的是将建立服务器的一些准备工作封装到一起,具体为
    (1)利用socket函数 创建监听套接字listenfd
    (2)利用bind函数将指定端口绑定到listenfd 上
    (3)利用listen 函数设置监听上限
    (4)利用epoll_ctl函数将创建好的listenfd 添加到监听树上

    2. do_accept 函数

      此函数的主要目的是利用accept 函数创建用于连接浏览器端的cfd, 并且设置epoll 的ET模式(边沿触发,更加高效), 并且设置为非阻塞模型(ET模式必须与非阻塞模式搭配使用), 最后将创建的cfd 添加到监听树上.

    3. do_read函数(整个项目最核心的部分)

      此函数的主要目的是根据cfd,解析http协议的请求行, 获取要访问的文件或者目录的路径, 并且将响应的http协议(包括状态行以及要访问的数据)发送回浏览器页面.

      在解析http协议的请求行中,利用了sscanf函数以及正则表达式去匹配请求行的三个部分,其中path 则为要访问的文件或者目录
    在这里插入图片描述

    sscanf(request, "%[^ ] %[^ ] %[^ ]", method, path, protocol);
    

      在得到要访问的文件名以后,利用stat函数获取文件的属性(目录or文件),如果要访问的文件不存在,则会返回一个404错误页面
    在这里插入图片描述
      如果是单个文件, 则需要先发送请求行,再利用send_file 函数按行读取文件,并将其发送会浏览器端, 其中除了请求行, 比较重要的是文件类型(在本项目中利用get_file_type 函数获取), 还有文件大小, 可以传-1让内核自己去计算,也可以传实际的大小,但是大小如果出错,则会造成数据丢失.
    在这里插入图片描述

      如果是目录, 也需要先传协议头部分,但是值得说明的是,在显示目录的时候,整个数据是封装在一个html页面里面的, 而且显示每个目录项,也都采用超链接的方式.
      在send_dir 函数内部, 首先利用scandir 函数遍历目录, 此函数返回一个数组, 数组中的每一位都是一个目录项, 所以直接遍历数组即可访问目录, 在遍历每一个目录项的时候, 也需要判断目录项的属性, 如果是文件, 则直接将其包含在超链接里面即可, 如果目录项还是一个目录, 则需要对目录项的名字进行拼接, 包含在超链接里面, 以便下一次访问子目录的内容, 具体html语言格式在此不再展开.

    总结:

      这是一个web 服务器入门的项目,代码也不是很多, 但是通过复现一遍所有代码, 收获还是蛮大的, 算是懂得了后台服务器编程的基本思路, 以后还要在上面继续扩展.

    源码:

    链接.

    展开全文
  • linux网络编程学习

    千次阅读 2012-08-04 00:18:44
    终于抽时间学习了linux网络编程,以前只是对socket有个字面上的了解,具体的机制和用法一无所知。正好项目要用,学习下,做个笔记。  在linux上,任何都可以当做文件来对待。获得一个文件描述符,就可以对它进行...

         终于抽时间学习了linux的网络编程,以前只是对socket有个字面上的了解,具体的机制和用法一无所知。正好项目要用,学习下,做个笔记。

         在linux上,任何都可以当做文件来对待。获得一个文件描述符,就可以对它进行读写操作。socket也是一样。

         socket在linux下被翻译成套接字,我觉得这个翻译真的很烂,第一次接触的人不可能知道套接字是个什么东西。翻译成插座反而直观明了,更容易理解。

         socket是为c/s模型设计的,也就是客户--服务器模型。解决了进程间通信的问题。

    下面主要说的面向连接的socket,无连接的socket就不讲了。

         简单的将,服务端起一个socket,监听一个端口,等待客户端的连接,然后客户端起一个socket,指向服务端的ip地址,端口号,向服务器发起连接请求。连接成功后就可以发送信息。看一下简单的流程


    前面讲了socket可以当做一个文件来读写。那么读写文件一般都是要获得一个文件描述符,socket通信要获得一个socket描述符,也可以理解为特殊的文件描述符,叫法不同而已。

    通过socket函数获得socket描述符

    int socket(int domain , int type , int protocol);
    这个函数返回一个int型的值,就是socket描述符。如果发生错误则返回-1。

    domain确定通信域,包括地址格式。通常被设为AF_INET代表IPv4因特网。

    type确定socket类型,是无连接还是有链接的。

    protocol通常设为0,表示按给定的域和socket类型选择默认协议。比如domain为AF_INET,type为SCOK_STREAM时,默认协议就是TCP。

    bind()函数绑定端口。声明如下

    int bind (int sockfd , const struct sockaddr *my_addr , int addrlen) ;
    其中,sockfd就是socket函数返回的socket描述符;my_addr是一个指向struck sockaddr的指针,包含地址信息:名称、端口和ip地址。

    addrlen一般设为sizeof(struct sockaddr);

    connect()函数连接服务器地址,声明如下:

    int connect (int sockfd, const struct sockaddr *serv_addr, int addrlen);    

    返回一个int型的值,连接成功返回0,出错则返回-1;

    参数sockfd还是socket描述符,此时是请求连接的socket。

    serv_addr就是服务器地址。

    listen函数

    这个函数用来监听端口是否有请求,然后可以使用accept()来处理请求。声明:

    int listen(int sockfd, int backlog);
    sockfd跟前面一样,是socket描述符,backlog是未处理的请求队列可容纳最大数目。

    accept()函数

    int accept(int sockfd, void *addr, int *addrlen);
    返回一个int值,这个int值是一个新的socket描述符,代表这个连接。此时有两个socket描述符,返回的这个就是和远程计算机的连接,而一开始的那个socket描述符仍然在指定的端口上进行监听。此时返回的这个socket描述符就可以进行读写了。

    参数sockfd是在监听的socket描述符。

    addr是一个struct sockaddr_in结构的指针,存储远程计算机的信息,如端口号和ip地址

    发生错误返回-1.

    面向连接的程序中,服务器执行如下函数:

    调用socket()函数创建一个socket。

    调用bind()函数把自己绑定在一个地址上。

    调用listen()函数监听连接。

    调用accept()函数处理请求。

    调用send()和recv()来发送和接受消息

    客户端执行下面的函数:

    调用socket()函数创建一个socket。

    调用connect()函数连接到服务器的网络地址上。

    调用send()和recv()函数来发送和接收消息。

    不传代码了,代码是改的别人的demo。

    展开全文
  • Linux网络编程(第2版)》涉及面广,从基本的编程工具介绍和编程环境搭建,到高级技术和核心原理,再到项目实战,几乎涉及Linux网络编程的所有重要知识。 《Linux网络编程(第2版)》共分4篇。 第1篇介绍Linux操作...
  • linux网络编程手记

    2015-04-20 20:29:46
    linux下的网络编程有一段时间了,中间遇到过很多问题,其中不少是因为自己对网络编程和网络协议的一些基本概念搞不清楚,趁着今天没心情干活就把自己在网络编程方面的理解和一些经验总结一下,Request For ...

    做linux下的网络编程有一段时间了,中间遇到过很多问题,其中不少是因为自己对网络编程和网络协议的一些基本概念搞不清楚,趁着今天没心情干活就把自己在网络编程方面的理解和一些经验总结一下,Request For Comments。

    在诸多的网络协议中接触的最多也最紧密的无疑是TCP和UDP,SCTP之前因为项目原因也研究过,不过最终由于方案修改给抛弃了,TCP年代已经很久远,在网上的资料也非常多,而且我感觉它是一种非常复杂的协议,感觉要把编好基于TCP的程序光简单地了解几个socket API是不够的,刚开始接触网络编程的时候自己确实也吃了不少苦头,后来我还专门拿时间出来阅读了一下RFC,再加上长时间的实践总算也对TCP有所了解,把自己的一些经验和教训都总结一下。

    首先说一下TCP的状态转移图,这个应该是很重要的,了解TCP运行周期的各种状态才能更好地运用netstat之类的应用程序去对程序进行调试,我这里收藏了一张图,是TCP的状态图,记不清是从哪里找来的,也不知道直接版权该给谁,但这张图应该最终是出自于UNP第一卷的,那copyright就是UNP了吧。

    1.TCP连接状态

    连接建立的几个状态没什么可说的,TCP的三次握手众所周知,更重要的是TCP连接中止的几个状态,应该可以说是连接中止需要四次握手吧。

    当Client调用close函数主动关闭socket时,连接状态被标记为FIN_WAIT_1,Server在收到FIN之后read函数会返回0,这里server知道Client已经关闭连接,回复ACK,这里client连接状态被标记为FIN_WAIT_2,接下来Server调用close函数关闭连接,这时候Server向client发送FIN,Client收到之后将状态标记为TIME_WAIT,并回复ACK。

    TIME_WAIT这个状态存在的意义在于Client回复的ACK未必会被Server收到,可能在传输过程中导致包的丢失,而这里Server未收到ACK之后会重新向Client发送FIN,如果client未将状态标记为TIME_WAIT而是直接标记为CLOSED,则Server发送的FIN会直接收到RST,导致Server端的发送错误,因此Client需要保证有一个TIME_WAIT状态,而这个状态会持续两位的MSL(最大段生命周期),从而保证Server成功发送FIN并发送ACK,为了保证两个数据段传输的最大时间,因此TIME_WAIT持续的时间为两倍的MSL。

    Server在收到第一个FIN之后会将状态标记为CLOSE_WAIT,此时是client主动关闭连接,这里Server也需要调用Close给Client发送FIN(如上所述),之后Server的状态标记为LAST_ACK,表示Server正在等待Client发送的最后一个ACK,当Server收到最后一个ACK便会将连接标记为CLOSED,这时连接结束。TIME_WAIT这个状态和套接字的SO_REUSEADDR选项是有关系的,这个留做后面讨论。

    2.TCP连接异常情况

    TCP连接异常分为很多种情况,无论是客户端程序还是服务器端程序都需要考虑周全的。

    Server在连接的过程中程序崩溃或者CTRL+C中止程序,或者kill接Server进程。这时会导致Server立即发送一个FIN数据包给Client,Client如果此时正在调用recv函数,则recv函数返回0,表示服务器已关闭连接,如果Client调用send函数继续向Server发送数据,Server在收到后会回复RST,而此时send方法会触发SIGPIPE信号,表示通信管道已断开,在程序中如果对该信号不做处理则会导致程序的崩溃,一般在程序开始时会忽略此信号,则在这种情况下send函数会返回-1,表示发送失败,处理SIGPIPE的代码如下:

    前几天实验室这个破项目非要加上什么流媒体的功能,简单起见使用了VLC来实现,客户端这边就得需要把相关的播放界面整合到现有的界面里面来,之前的客户端UI我都是用GTK实现的,没办法,GTK用得比较多,相对熟练一些就用GTK来做了,没想到要把VLC整到GTK里面来那么麻烦,原生的libvlc是不支持GTK的,需要加一层libvlc-gtk,从网上好不容易下载到了libvlc-gtk的源码,从哪里下的也记不清了,反正就是零散地几个文件,没有README甚至连Makefile都没有,没办法首先得先写个Makefile把它编译一下,libvlc-gtk一共有八个文件,Makefile如下:

    struct sigaction sa;
    sa.sa_handler = SIG_IGN;
    sigaction(SIGPIPE, &sa, 0 );

    另外在这种情况下select函数也会立即返回,socket描述符会被设置,而试图从该socket中recv数据,则会返回-1。

    另外一种情况是Server系统崩溃或者网络直接异常或断开,这时候Server不可能再给Client发送FIN包,而Client调用send函数后会导致数据包一直重传直接超时后返回-1,而recv函数也会一直阻塞直接超时后返回-1。这种情况就很难判断是Server端进程关闭还是网络异常,这种情况一般会用TCP的KEEP ALIVE机制,每隔一定的时间向对方发送一个只有一字节数据内容的数据包,对端收到后会返回一个ACK,以此来确保连接正常,如果未收到ACK,会尝试重传,直到重试规定次数后可以将与对端的连接标记为断开,send和recv将会返回-1。KEEP ALIVE的使用方法如下:

    int tcp_keep_alive(int socketfd)
    {
    	int keepAlive = 1;
    	int keepIdle = 10;         /* 开始发送KEEP ALIVE数据包之前经历的时间 */
    	int keepInterval = 10;   /* KEEP ALIVE数据包之前间隔的时间 */
    	int keepCount = 10;     /* 重试的最大次数 */
     
    	if(setsockopt(socketfd , SOL_SOCKET , SO_KEEPALIVE
    				,(void*)&keepAlive,sizeof(keepAlive)) == -1){
    		debug_info("set SO_KEEPALIVE failed\n");
    		return -1;
    	}
     
    	if(setsockopt(socketfd , SOL_TCP , TCP_KEEPIDLE
    				,(void *)&keepIdle,sizeof(keepIdle)) == -1){
    		debug_info("set TCP_KEEPIDEL failed\n");
    		return -1;
    	}
     
    	if(setsockopt(socketfd , SOL_TCP , TCP_KEEPINTVL
    				,(void *)&keepInterval,sizeof(keepInterval)) == -1){
    		debug_info("set TCP_KEEPINTVL failed\n");
    		return -1;
    	}
     
    	if(setsockopt(socketfd , SOL_TCP , TCP_KEEPCNT
    				,(void *)&keepCount,sizeof(keepCount)) == -1){
    		debug_info("set TCP_KEEPCNT failed\n");
    		return -1;
    	}
    	return 1;
    }

    上面这个函数只针对Linux,昨天有网友告知在Mac OS上TCP_KEEPIDLE ,TCP_KEEPINTVL, TCP_KEEPCNT这些宏将未定义。另外对于这些参数的设置也是需要注意的,很多系统中它们的设置并不是对单个socket描述符起作用的,而是该机器上的所有socket描述符起作用的,所以这个需要注意(这个是从UNP里面看到的)。

    3.关于字节顺序
    Linux的主机字节顺序是采用little-endian字节顺序,而网络字节顺序是采用big-endian字节顺序,字节顺序转换是必需的。写了一个小程序来检测字节顺序,不知道对不对,Request For Comment.

    #include 
     
    int main(int argc, char **argv)
    {
    	short s = 0x0102;
    	if((*(unsigned char*)&s) == 2)
    		printf("little endian\n");
    	else if((*(unsigned char*)&s) == 1)
    		printf("big endian\n");
    	else
    		printf("unknown endian\n");
     
    	return 0;
    }

    3.关于send和recv

    写过socket程序的人肯定都会知道send和recv函数并不会总是返回要求发送或读取的字节数,如:

    int ret = recv(sk, buf, 2096, 0);

    这句话并不总是读取到完整地2096个字节,相反地,大多数情况下都不能将buf读满,recv只能返回当前可以读取到的字节数,如果协议规定本次读取肯定会读取到N个字节,那我一般的做法会写一个这样的函数来确保读取到固定的字节数:

    int buf_recv(int sock, void *buf, size_t len, int flags)
    {
    	int n, ret;
    	if(len == 0) return 0;
    	for(n=0;n!=len &&(ret = recv(sock, buf+n, len-n, flags)) != -1 &&ret; n += ret);
    	return (n!=len)? -1:n;
    }

    关于这两个函数还有很重要的一点是应该尽可能大地一次发送或接收更多地数据,当然前提是缓冲区中有这些数据的话,原因很简单,当通信链路很好的时候数据可能会填满系统缓冲区,而recv便是从缓冲区中读取数据,这时候一次读取更多地字节就意味着可以少调用几次recv函数,而这些函数通常都是调用了系统调用,需要进行内核态和用户态上下文的切换,也就意味着多调用几次recv会带来额外的开销,之前写的一个代理服务器的程序数据传输速度一直很低,后来修改了recv和send的缓冲区大小后速率提高了近一倍。

    4.关于非阻塞模式

    一般应用的时候都是使用阻塞式IO,至少我在大多数情况下都用的阻塞式IO,非阻塞很少应用,但存在便我价值,我用到的非阻塞IO的情况一般是用来进行超时connect,首先将socket设为非阻塞模式,connect立即返回-1,此时已向对端发送FIN,而并未来得及收到任何ACK,于是直接返回-1,但并不代表连接失败,errno会被置为EINPROGRESS ,表示连接正在进行中,然后通过select来设置socket可写的超时时间,如果规定时间内可写,且socket并无出错,则表示连接成功,socket出错则表示连接失败,或规定时间内不可写则表示连接超时,简单地写了如下代码:

    #include
    #include
    #include
    #include
    #include
    #include
    #include 
     
    int main(int argc, char *argv[])
    {
    	int                sk;
    	int                flags;
    	int                err = 0;
    	int                ret;
    	socklen_t          len;
    	struct sockaddr_in addr;
    	fd_set             fd_write;
    	struct timeval     tv;
     
    	if( (sk = socket(AF_INET, SOCK_STREAM, 0)) == -1 ) {
    		perror("socket");
    		return 1;
    	}
     
    	if( (flags = fcntl(sk, F_GETFL, 0)) == -1 ){
    		perror("fcntl GET flags failed");
    		return 1;
    	}
     
    	if(fcntl(sk, F_SETFL, flags | O_NONBLOCK) == -1) {
    		perror("fcntl SET flags failed");
    		return 1;
    	}
     
    	memset(&addr, 0, sizeof(addr));
    	addr.sin_family = AF_INET;
    	addr.sin_addr.s_addr = inet_addr("59.64.129.169");
    	addr.sin_port = htons(808);
     
    	if(connect(sk, (struct sockaddr*)&addr, sizeof(addr)) == -1	) {
    		if(errno != EINPROGRESS) {
    			perror("connect");
    			return 1;
    		}
    		FD_ZERO(&fd_write);
    		FD_SET(sk, &fd_write);
    		tv.tv_sec = 5;
    		tv.tv_usec = 0;
     
    		ret = select(sk + 1, (fd_set*)0, &fd_write, (fd_set*)0, &tv);
     
    		if(ret > 0){
     
    			if(FD_ISSET(sk, &fd_write)) {
    				len = sizeof(int);
     
    				if(getsockopt(sk, SOL_SOCKET, SO_ERROR, &err, &len) == 0) {
    					if(err == 0) { printf("connect success\n"); return 0; }
    					else { fprintf(stderr, "connect:%s\n", strerror(err)); return 1; }
    				}else{
    					fprintf(stderr, "getsockopt:%s\n", strerror(err));
    					return 1;
    				}
    			}else{
    				fprintf(stderr, "connect(FD_ISSET) failed\n");
    				return 1;
    			}
     
    		}else if(ret == 0) {
    			fprintf(stderr, "connect timeout\n");
    			return 1;
    		}else {
    			fprintf(stderr, "connect(select):%s\n", strerror(errno));
    			return 1;
    		}
    	}else{
    		fprintf(stderr, "connect:%s\n", strerror(errno));
    		return 1;
    	}
    	return 0;
    }

    5.关于select多路复用

    select是网络编程中很常用的函数,用来进行IO多路复用,但之前我一直忽略了一个问题,当select返回时会将本次检查中不可用的描述符(如不可读或不可写)的描述符从描述符集中删除,只保留当前可用的描述符,在对多个socketfd进行利用的时候需要注意,每次循环select之前都需要在select之前用FD_SET重新设置描述符,否则之后便只能返回第一次可读的描述符了。

    6.关于UDP广播

    UDP广播这个也简单说一下,首先255.255.255.255这个地址是不能被路由的,只能被本物理网络的数据包接收。UDP广播之前需要给socket设置SO_BROADCAST选项:

    int brodopt = 1;
    setsockopt(cp_usock, SOL_SOCKET, SO_BROADCAST, &brodopt, sizeof(brodopt));

    UDP广播需要注意的一点是广播接收时接收端bind的本地地址的问题,接收端必须绑定INADDR_ANY这个地址才可以接收广播包,如果是绑定的某个特定的地址则无法接收广播包。

    OK,简单说这么几条,都是我编程时候遇到的经验总结,以后再遇到什么问题再接着补充。

    展开全文
  • linux网络编程-SOCKET

    2020-08-18 22:38:40
    linux下的网络编程——TCP 今天在工作中接触到了TCP,项目需求是利用海思平台将获取到的相机数据通过网络将数据发送给上位机。利用这个机会好好学习了一下网络这方面的东西。 socket socket,最近经常会遇到socket...

    linux下的网络编程

    今天在工作中接触到了TCP,项目需求是利用海思平台将获取到的相机数据通过网络将数据发送给上位机。利用这个机会好好学习了一下网络这方面的东西。

    socket

    • socket,最近经常会遇到socket编程,知道怎么去用但是一直没有理解它在网络中的作用。把自己查到的对它的解释整理一下。
    • Socket是进程通讯的一种方式,即调用这个网络库的一些API函数实现分布在不同主机的相关进程之间的数据交换。通过socket可以实现TCP以及UDP
    • 有几个需要理解的概念
    • IP地址:即依照TCP/IP协议分配给本地主机的网络地址,两个进程要通讯,任一进程首先要知道通讯对方的位置,即对方的IP。一般都是一个服务端和客户端,客户端链接服务端的时候需要的知道服务端的IP.
    • 端口号:用来辨别本地通讯进程,一个本地的进程在通讯时均会占用一个端口号,不同的进程端口号不同,因此在通讯前必须要分配一个没有被访问的端口号。

    相关的结构体

    struct sockaddr_in {
     uint8_t sin_len; /* 无符号的8位整数 */
     sa_family_t sin_family;
     /* 套接口地址结构的地址簇,这里为AF_INET */
     in_port_t sin_port; /* TCP或UDP端口 */
     struct in_addr sin_addr;
     char sin_zero[8];  
    
    };
    

    在使用过程中一般需要初始化的参数一般是 sin_familysin_portsin_addr。而sin_addr又是in_addr类型的数据

    struct in_addr {
     in_addr_t s_addr;     /* IPv4地址 */
    };
    

    所以初始化的方法

     struct  sockaddr_in server;
     server.sin_family=AF_INET;
     server.sin_port=htons(PORT);
     server.sin_addr.s_addr= htonl (INADDR_ANY);
    

    接下来通过函数bind去为套接字分配一个本地IP和端口

    bind(listenfd, (struct sockaddr *)&server, sizeof(server)
    

    需要注意的是客户端和服务器端的端口需要对应,最好用8000以后的端口号。
    其余的也都是固定的流程
    这个博客写的超级棒记录一下
    TCP:
    https://blog.csdn.net/yueguanghaidao/article/details/7035248
    UDP:
    http://blog.csdn.net/yueguanghaidao/article/details/7055985

    展开全文
  • linux 下的网络编程有一段时间了中间遇到过很多问题其中不少是因为自己对网络编程和网络协议 的一些基本概念搞不清楚趁着今天没心情干活就把自己在网络编程方面的理解和一些经验总结一下 Request For Comments 在...
  • 话虽些许夸张,但是事实也是,现在的网络编程几乎都是用的socket。 ——有感于实际编程和开源项目研究。 我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览器浏览网页时,浏览器的进程怎么与...
  • linux socket网络编程进阶推荐阅读开源项目--转 linux socket网络编程进阶推荐阅读开源项目--七夜的开源研究linux socket网络编程进阶推荐阅读开源项目2011-03-22 08:53:23 linux 经常有人问我怎么学习C...
  • Linux C++网络编程

    2020-11-18 09:05:49
    Linux C++ 网络编程(二) 前言 在上一节中以拆分的方式学习完 Linux 、C++、网络等知识后,这节会将这三个模块糅合起来,站在项目的基础上再次去学习这三个模块。 Linux 网路编程比较经典的有 Redis、Muduo、...
  • 想学习Linux后台开发,求推荐C/C++类开源项目 谢谢
  • 聊天室——17年暑假项目(Linux C网络编程)-源码
  • 近一年做了些linux服务端网络编程项目,这里需要整理一下服务器端常见的编程模型。这片博文https://blog.csdn.net/qq_29108585/article/details/78177278 整理的思路比较清晰。另外,在经典书籍《Unix网络编程 卷1...
  • linux网络编程——聊天室总结

    千次阅读 2019-08-19 21:54:12
    暑假留校的主要任务是学习linux下的c语言编程,之前写了my_ls, my_shell这两个可以说是练手的小项目,而最后的项目聊天室也是花了自己快两周的时间,说实话第一次写这种(对自己而言)大项目,最深刻的体会就是整体...
  • 注意epoll的性能提升,暂时我的理解比较浅 其实服务端的数据存储并不只限于mysql 可以是数组+mysql 可以是链表+mysql 可以是数组+链表+mysql 可以是线程池+mysql 可以是很多很多。。。。...用的是看个人能力,但如果...
  • linux.h" #include #include #include #include "wrang.h" #include "List.h" #include "pthreadpool.h" //#define SERV_ADDRESS "47.94.14.45" //#define SERV_ADDRESS "127.0.0.1" #define SERV_ADDRESS "192.168....
  • 现在大多数计算机网络都是根据TCP/IP协议栈搭建起来的,为了具体实现TCP/IP协议栈,Linux操作系统就对外提供了一套可供程序员做网络开发所用的操作接口,这就是Socket编程接口,这就是用来进行Linux网络编程项目开发...
  • 明明聊天室是要在暑假两个星期内写完的,由于疫情没有回校学习,在家也是写一点放松一点,并且第一次写一个比较大的项目有点力不从心,总之有遗憾吧,在网络编程这块学习也是浅上折纸,在想整体架构上有明显不足,...
  • 话虽些许夸张,但是事实也是,现在的网络编程几乎都是用的socket。 ——有感于实际编程和开源项目研究。 我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览器浏览网页时,浏览器的进程...
  • 实验目的 通过实现NTP协议的练习,进一步掌握Linux网络编程,并且提高协议的分析与实现能力,为参与完成综合性项目打下良好的基础。2.实验内容 Network Time Protocol(NTP)协议是用来使计算机时间同步化 的一种...
  • Linux程序设计技术技巧与项目实践网络编程第9章.pptx
  • Linux网络编程:recv的返回值

    千次阅读 2016-07-29 23:41:44
    recv是网络编程中用于TCP传输接收数据的接口,由于工作中一直没有接触到网络编程,虽然知道这个函数,但是没有使用经验,所有对接口细节不是很了解。直到前阵子在项目中调试第三方的源码时,跟踪到这个函数,才发现...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,096
精华内容 438
关键字:

linux网络编程项目

linux 订阅