Linux 编程
CMbug
这个作者很懒,什么都没留下…
展开
-
Linux/Windows 下字符编码转换
1、简介 最近的一个小项目,涉及到字符编码的转换问题,比如Windows下的多字节编码数据到Linux下后会是乱码,因为Windows下多字节编码使用的是GB2312,而Linux下默认则使用的UTF-8,下面的类就提供了该转换的实现!2、使用简介 2.1 我如何知道该类能实现哪些编码之间的转换? 因为在Linux上用到了iconv,所以要想知道该类支持哪些编码之间的转换,可以在终端中原创 2015-05-14 12:36:54 · 3073 阅读 · 0 评论 -
【网络】(四)网络相关函数使用简介
1、getsockname用于获取自己的ip和端口使用举例: struct sockaddr_in localaddr; socklen_t len = sizeof(localaddr); memset(&localaddr,0,sizeof(localaddr)); //获取自己的ip和端口 if(getsockname(sk_fd,(struct socka原创 2015-09-12 18:06:47 · 452 阅读 · 0 评论 -
【网络】(十二)UDP简介
1、UDP特点无连接;UDP不维护端到端的连接状态基于消息的数据传输服务;不存在粘包问题,可认为数据包之间是有边界的不可靠;数据包可能丢失、重复、乱序,它缺乏流量控制一般情况下UDP更加高效;2、UDP编程模型3、echo服务器和客户端的UDP实现服务端代码#include <stdio.h>#include <stdlib.h>#include <errno.h>#include原创 2015-09-16 11:38:17 · 800 阅读 · 0 评论 -
【网络】(十)select的限制与解决方法poll
在前面的《第七篇》和《第八篇》文章中已经使用select函数对服务器和客户端进行了重写,但这有个问题存在,如果有非常多的客户端需要连接到服务器,那很可能连接到1020个客户端时,服务端就会报错了,原因在于用select实现的并发服务器能够达到的并发数,受两方面限制一个进程能打开的最大文件描述符限制,这可通过调整内核参数修改!select中的fd_set集合容量的限制(FD_SETSIZE),它不原创 2015-09-15 16:07:39 · 1136 阅读 · 0 评论 -
【网络】(十一)更高效的epoll
第十篇文章中将select函数换做了poll,解决了客户端最大并发数量限制的问题,原创 2015-09-15 19:58:00 · 888 阅读 · 0 评论 -
【网络】(六)TCP的十一种状态
1、TCP 十种状态过程描述:0.1 服务器B和客户端A中的套接字都处于CLOSE状态(图中未标出)0.2 服务器B调用socket/bind/listen函数创建了一个套接字后,处于LISTEN状态,该套接字属于被动套接字,被动套接字不能用来发起连接,只能接受连接0.3 客户端A调用socket/connect函数创建一个套接字后,处于SYN_SENT状态,该套接字属于主动套接字,用来发起连原创 2015-09-13 17:32:12 · 3695 阅读 · 0 评论 -
【网络】(九)close与shutdown
1、两者的区别close函数会终止数据传送的两个方向,包括套接口的读取和写入;shutdown函数可以有选择的终止某个方向的数据传送,或者终止两个方向;shutdown函数的how参数如果为SHUT_RDWR,表示关闭了套接口的写端,可以保证此时对方会收到一个FIN段,并导致对方read函数读取到EOF并返回0,shutdown函数关闭写端时总会这么做, 它不理会套接字引用计数;而close原创 2015-09-14 16:40:40 · 741 阅读 · 0 评论 -
【网络】(七)五种I/O模型--I/O复用 Select(一)
1、五种I/O模型五种I/O模型分别是:阻塞I/O非阻塞I/OI/O复用(select/poll)信号驱动I/O异步I/O0.1 阻塞I/O连接完成,我们通常使用recv函数读取数据,如果此时没有数据,那么该函数阻塞,直到对方发送的数据到达套接口缓冲区,此时该函数将数据复制到用户缓冲区中,并返回!0.2 非阻塞I/O连接完成,调用recv函数,并将套接口设置为非阻塞模式(fcntl(sk原创 2015-09-13 20:33:54 · 983 阅读 · 0 评论 -
【网络】(八)I/O复用--Select(二)
第七篇文章中简介了几种IO模型,也使用select函数改进客户端的代码,本篇文章用它来改进一下服务端代码!用select函数实现的服务器程序,叫做并发服务器,它还是在排队处理任务,无法并行处理这些事件!1、select事件发生条件0.1 可读事件套接口缓冲区有数据可读;连接的读一半关闭,即接收到FIN段时,可读,并且读操作会返回0如果是监听套接口,已完成队列不为空时,可读;即有新的连接请求套原创 2015-09-14 11:01:31 · 809 阅读 · 0 评论 -
【网络】(五)避免僵尸进程
前面的四篇文章中,对于僵尸进程都只做了简单的处理,我忽略了子进程退出时发送给父进程的SIGCHLD信号,本篇文章来详细谈论一下僵尸进程!1、为什么会有僵尸进程?当父进程fork出的子进程运行结束后,为了父进程还能够获得子进程的一些信息,系统会维护子进程的一些信息,这些信息包括子进程的进程ID、终止状态以及资源利用信息(CPU时间,内存使用量等等)。如果一个进程终止,而该进程有子进程处于僵尸状态,那么原创 2015-09-13 11:10:55 · 902 阅读 · 0 评论 -
【网络】(三)流协议粘包问题
在第二篇中,谈到了流协议的粘包问题以及一种解决方法的实现,在数据的开始显示的指明数据的长度;这是一种不错的解决方法,另外,也有说到可以根据数据中的特殊字符来判断是否接收完了一整条消息,本篇将在上一篇的基础上实现这一方法!原理:依据数据尾部是否有’\n’,来表示消息是否接收完成1、核心函数实现//使用recv函数从套接字接收缓冲区中接收数据,但并不从缓冲去中清除数据ssize_t recv_peek原创 2015-09-12 16:55:27 · 774 阅读 · 0 评论 -
【网络】(二)流协议粘包问题
1、流协议与粘包 TCP协议是基于字节流的,数据无边界,无边界反应在对方接收消息时无法保证一次性返回多少个字节,有可能收到的不是一个完整的消息,可能是半个消息、或者多于一个消息,这就是TCP的粘包问题 UDP协议基于数据报,数据有边界,体现在对方一次收到的是一个完整的消息产生粘包的因素 如上图所示,应用层首先用write函数将要发送的数据拷贝到套接字发送缓冲区中,该缓冲区的大小由SO_SNDB原创 2015-09-12 15:35:24 · 839 阅读 · 0 评论 -
【网络】(一)Socket 简介
1、什么是socket? socket可以看成是用户进程与内核网络协议栈的编程接口。 socket不仅可以用于本机的进程间通信,还可以用于网络上不同主机的进程间通信! 2、IPv4套接字地址结构 通常也被称为“网际套接字地址结构”,名为:sockaddr_in,位于头文件struct sockaddr_in{ uint8_t sin_len; //整个结构体长度原创 2015-09-12 09:54:02 · 756 阅读 · 0 评论 -
Windows WCHAR 到 Linux wchar_t 字符类型的转换
1、简介 这几天涉及到一个小项目,Windows 和Linux通过TCP进行通信,但是他们之间的字符类型上是有区别的,所有Windows上的数据发送到Linux上后,如果不经过转换,会出现乱码的情况,Windows 的WCHAR类型实际上是wchar_t,但是它只占用2个字节(既UTF-16),而Linux上wchar_t则使用的是多字节(UTF-8),下面的函数提供了他们之间的相互转换!2、程序原创 2015-05-14 12:05:25 · 4493 阅读 · 0 评论 -
获取进程能打开的最大文件数量【OPEN_MAX】
手上一个小项目,需要获取一个当前Linux操作系统下,一个进程能打开的最大文件数目,在《linux程序设计 第4版》 85页有说: 任何一个运行中的程序能够同时打开的文件数是有限制的,这个限制通常是由limits.h头文件中的常量OPEN_MAX定义的,它的值随系统的不同而不同,但POSIX要求它至少为16! 但我尝试使用该宏时,却已经找不到该宏的定义了,查了一下资料,才知道2.6.24以后的内原创 2015-09-09 11:09:12 · 7951 阅读 · 4 评论