阻塞socket和非阻塞socket的区别:
1、读操作
对于阻塞的socket,当socket的接收缓冲区中没有数据时,调用会一直阻塞住,直到有数据到来才返回。当socket缓冲区中的数据量小于期望读取的数据量时,返回实际读取的字节数。当sockt的接收缓冲区中的数据大于期望读取的字节数时,读取期望读取的字节数,返回实际读取的长度。
对于非阻塞socket而言,socket的接收缓冲区中有没有数据,read调用都会立刻返回。接收缓冲区中有数据时,与阻塞socket有数据的情况是一样的,如果接收缓冲区中没有数据,则返回错误号为EWOULDBLOCK,表示该操作本来应该阻塞的,但是由于本socket为非阻塞的socket,因此立刻返回,遇到这样的情况,可以在下次接着去尝试读取。如果返回值是其它负值,则表明读取错误。
因此,非阻塞的rea调用一般这样写:
if ((nread = read(sock_fd, buffer, len)) < 0)
{
if (errno == EWOULDBLOCK)
{
return 0; //表示没有读到数据
}else return -1; //表示读取失败
}else return nread;读到数据长度
2、写操作
对于写操作write,原理是类似的,非阻塞socket在发送缓冲区没有空间时会直接返回错误号EWOULDBLOCK,表示没有空间可写数据,如果错误号是别的值,则表明发送失败。如果发送缓冲区中有足够空间或者是不足以拷贝所有待发送数据的空间的话,则拷贝前面N个能够容纳的数据,返回实际拷贝的字节数。
而对于阻塞Socket而言,如果发送缓冲区没有空间或者空间不足的话,write操作会直接阻塞住,如果有足够空间,则拷贝所有数据到发送缓冲区,然后返回.
非阻塞的write操作一般写法是:
int write_pos = 0;
int nLeft = nLen;
while (nLeft > 0)
{
int nWrite = 0;
if ((nWrite = write(sock_fd, data + write_pos, nLeft)) <= 0)
{
if (errno == EWOULDBLOCK)
{
nWrite = 0;
}else return -1; //表示写失败
}
nLeft -= nWrite;
write_pos += nWrite;
}
return nLen;
3、建立连接
阻塞方式下,connect首先发送SYN请求道服务器,当客户端收到服务器返回的SYN的确认时,则connect返回.否则的话一直阻塞.
非阻塞方式,connect将启用TCP协议的三次握手,但是connect函数并不等待连接建立好才返回,而是立即返回。返回的错误码为EINPROGRESS,表示正在进行某种过程.
4、接收连接
对于阻塞方式的倾听socket,accept在连接队列中没有建立好的连接时将阻塞,直到有可用的连接,才返回。
非阻塞倾听socket,在有没有连接时都立即返回,没有连接时,返回的错误码为EWOULDBLOCK,表示本来应该阻塞。
无阻塞的设置方法
方法一:fcntl
int flag;
if (flag = fcntl(fd, F_GETFL, 0) <0) perror("get flag");
flag |= O_NONBLOCK;
if (fcntl(fd, F_SETFL, flag) < 0)
perror("set flag");
方法二:ioctl
int b_on = 1;
ioctl (fd, FIONBIO, &b_on);
㈡ Linux c++ 网络编程 前途如何
我就是做这个的抄,呵呵
LINUX程序员袭平均工资比WINDOWS高,这时肯定的。
网络编程和嵌入式,怎么说呢,这个不方向,只是基本技术。
也就是说,学习LINUX的话,肯定是开发软件了,包括应用程序、系统层(协议、驱动)这些,基本上LINUX下开发大部分会用到网络编程,也就是SOCKET,即使很多本地应用也用到它,应为它比进程通信强大。
嵌入式呢,主要是指开发平台是ARM这样的平台,但对于软件工程师,什么平台不是太有关系,只是做做移植而已,也就是重新编译。
LINUX下的软件开发式一个很难学的东东,应为它涉及的东西比较多,知识较广,因为你学LINUX不懂底层就等于不懂LINUX,涉及底层的话,你要学操作系统原理、看内核源码、分析协议栈、学习硬件原理(学操作系统要了解)、学习LINUX下的编译环境。做嵌入式的还要掌握嵌入式的开发流程,比如搭建平台、交叉编译等。
介绍到这里,把我说的这些掌握了,有一点经验了,你工资低于一万是不可能的。呵呵。
㈢ 学习unix网络编程,哪个版本的linux好一点
如果是搞开发的话,还得自己动手,个人觉得你还是以ubuntu为主吧,毕竟版是网络方面的。还是以大众权化为主。
至于开发环境缺很多东西,这个可以自己添加。实际上ubuntu的软件仓库里尽管的下吧。搞linux不能自己动手解决依赖问题,就无法为用户提供良好的软件。
centoos也行。反正centoos用户都是系统崩于前而面不改色的牛人,根本不怕依赖问题。实际上linux里很多人动手能力都非常强,毕竟大部分都是自己自学的,其本身素质就比较高。
㈣ linux网络工程师都需要掌握哪些技能
我是做LINUX的,给你讲一下吧
分要不要无所谓,我也很喜欢LINUX,已知研究相关技术在。
第一,掌握好语言,LINUX主要是C,这个是最基础的,因为它自己是C写的:)
学习C可以看谭浩强的绿皮C语言。然后把数据结构、操作系统原理学好。
第二,看LINUX下面的书,推荐一两本经典的:《unix环境高级编程》、《LINUX程序设计》这两本差不多,都是将LINUX下的编程技术。建议看书的时候把书上的例子编译一下,哪怕是照着书敲进电脑。哦,忘了说,先要转个LINUX,基本命令和操作要熟悉,GCC编译器怎么用熟悉一下。
第三,你说你想做网络编程,在二的基础上,就可以学习为那网络编程了,其实二的书里面就介绍了网络编程技术,基本应用因该是够了,如果想深入学习的话,《LINUX网络编程》、《TCP/IP》卷一、卷二都应该看看。
第四,为了成为合格的LINUX软件工程师,应该看看LINUX内核,推荐入门的《LINUX内核完全剖析》,深入一点《深入理解LINUX内核》。这个对你在LINUX下写任何程序都有用。
第五,在这我想说LINUX下做什么不重要,因为一般的项目涉及很多技术,不会仅仅是网络编程,所以你都应该做一下。比如,LINUX下通常的开发就是协议开发、驱动开发、应用软件、甚至是开发内核等等,这些都需要对各个技术的了解。如果做应用,就需要用到QT、GTK等图形库了。
还有,不要怕,我用了两年的学习就基本能做大项目了,最主要的就是C和LINUX内核。这也是区别一般程序员和高手的位置。
㈤ 请问Linux下学习网络编程应该具备哪些基础知识
如果铁了心干Linux编程复,那还是制要学好C语言,至于C++则最好别学(如果非C++不嫁,那么C语言还是尽量不要深入)。
对C++实在不了解(实际上是根本没学过,咱是散修)。Linux编程最好是先掌握一个脚本语言(shell、perl等,不需要学完,只需要知道它可以干哪些事,至于怎么实现,可以在以后慢慢学),网络协议很可能要学一下,网络设备也要了解一下(总不好在U盘上建日志文件系统吧),当然,最重要的始终是你所选择的编程语言。
网络编程的工作,当然要找有这方面发展意向的机构(只要是有网络服务的机构,都会有这方面的人才需求,但国内大部分停留在网页开发上)。
其实什么都不用管,什么都不用急着准备,给自己找点事做(实在想不出什么可做的,不妨找点开源项目来看,如果有不懂的地方,再针对性地学习,如果全看懂了,就试着去改进它,或找下一个项目),用多少学多少,不要被老师“将来或许用得着”给束缚住(等你学完所有将来或许用得着的东西,只怕黑白无常为等你,早就成了望夫石了)。
最后再补充一点:如果要学C语言,K & R 两人写的C语言书蛮出名(有中英文版本,国际知名度甚高,几乎是知道POSIX就会知道这本书)。
㈥ Unix/Linux网络编程可以用来做什么
如果你还不知道有什么用处,建议你先把网络编程放一边;先学习你目前最需要用到的。等到你有着方便的需求时,你自然就明白网络编程有什么用处了。这也是学习的一种方法,需求导向型的学习方法会有很高的效率。
㈦ linux c 网络编程学那本书好我已经熟悉c语言,网络的一些基本原理,只是编程方面有待提高!
嗯,去各大LINUX论坛,UBUNTU是个不错的选择,我是学PYTHON的。
㈧ Linux/UNIX网络编程的内容简介
在本书编写过程中,编著者参阅了国内外同类书籍及各类报刊杂志,将精华内思想应用到教容学实践中,形成的教学成果与体会反映在书中。在书中相关章节,编者都至少列举一个完整的例子来说明问题,学习者将书中的基础实验做好,再通过相关章节中的实验进行验证,就可以学习高级Linux/UNIX编程了。
本书在编写上力求由简到繁、由浅入深和循序渐进,读者不但可以学会程序设计的基本知识、设计思想和方法,还可以学会网络程序设计的通用方法与步骤。本书适合作为高等院校计算机及相关专业学生的教材,也可作为广大计算机爱好者、网络研究人员和网络程序开发人员的自学参考书。
㈨ 为什么要学linux网络编程知乎
现在国内的很多书籍是以Centos系统为平台编写的,当然作者大多会列出来诸多的理由回,但很答多都是以讹传讹的歪曲道理,根本没有剖析到RedHat公司的运作方法和Centos系统的本质,Centos系统是通过将RHEL系统释放出的源代码二次编译的Linux系统之一,命令操作和服务配置方法自然都是完全相同,去掉了很多红帽收费的服务套件功能,并且不提供任何形式的技术支持,那么选择的理由只有一个——免费!,当“高手们”大举免费、开源、正义的旗帜来宣扬Centos系统的时候,诸不知Centos系统其实早在2014年初就已经被红帽公司收购,只是战略性的免费而已,而根据Gnu GPL许可协议,我们同样也可以免费使用RHEL系统,甚至是修改代码后创建出衍生产品,自由程度是没有任何的差异,更无关道德问题。
㈩ Linux开发需要什么呢需要具备什么基础呢
一、linux和os:
1、命令:netstat tcpmp ipcs ipcrm 这四个命令的熟练掌握程度基本上能体现实际开发和调试程序的经验
2、cpu 内存 硬盘 等等与系统性能调试相关的命令必须熟练掌握,设置修改权限 tcp网络状态查看 各进程状态 抓包相关等相关命令 必须熟练掌握
3、awk sed需掌握
4、共享内存的使用实现原理、然后共享内存段被映射进进程空间之后,存在于进程空间的什么位置?共享内存段最大限制是多少?
5、c++进程内存空间分布(注意各部分的内存地址谁高谁低,注意栈从高道低分配,堆从低到高分配)
6、ELF是什么?其大小与程序中全局变量的是否初始化有什么关系(注意.bss段)
7、使用过哪些进程间通讯机制,并详细说明
8、makefile编写,虽然比较基础,但是会被问到
9、gdb调试相关的经验,会被问到
10、如何定位内存泄露?
11、动态链接和静态链接的区别
12、32位系统一个进程最多多少堆内存
13、多线程和多进程的区别(重点 必须从cpu调度,上下文切换,数据共享,多核cup利用率,资源占用,等等各方面回答,然后有一个问题必须会被问到:哪些东西是一个线程私有的?答案中必须包含寄存器,否则悲催)
14、写一个c程序辨别系统是64位 or 32位
15、写一个c程序辨别系统是大端or小端字节序
16、信号:列出常见的信号,信号怎么处理?
17、i++是否原子操作?并解释为什么???????
18、说出你所知道的各类linux系统的各类同步机制(重点),什么是死锁?如何避免死锁(每个技术面试官必问)
19、列举说明linux系统的各类异步机制
20、exit() _exit()的区别?
21、如何实现守护进程?
22、linux的内存管理机制是什么?
23、linux的任务调度机制是什么?
24、标准库函数和系统调用的区别?
25、补充一个问题:系统如何将一个信号通知到进程?
二、c语言:
1、宏定义和展开(必须精通)
2、位操作(必须精通)
3、指针操作和计算(必须精通)
4、内存分配(必须精通)
5、各类库函数必须非常熟练的实现
6、哪些库函数属于高危函数,为什么?(strcpy等等)
三、c++:
1、一个String类的完整实现必须很快速写出来(注意:赋值构造,operator=是关键)
2、虚函数的作用和实现原理(必问必考,实现原理必须很熟)
3、sizeof一个类求大小(注意成员变量,函数,虚函数,继承等等对大小的影响)
4、指针和引用的区别(一般都会问到)
5、多重类构造和析构的顺序
6、stl各容器的实现原理(必考)
7、extern c 是干啥的,(必须将编译器的函数名修饰的机制解答的很透彻)
8、volatile是干啥用的,(必须将cpu的寄存器缓存机制回答的很透彻)
9、static const等等的用法,(能说出越多越好)
四、数据结构或者算法:
1、《离散数学》范围内的一切问题皆由可能被深入问到(最重要,最体现功底,最能加分,特别是各类树结构的实现和应用)
2、各类排序:大根堆的实现,快排(如何避免最糟糕的状态?),bitmap的运用等等
3、hash, 任何一个技术面试官必问(例如为什么一般hashtable的桶数会取一个素数?如何有效避免hash结果值的碰撞)
五、网络编程:
1、tcp与udp的区别(必问)
2、udp调用connect有什么作用?
3、tcp连接中时序图,状态图,必须非常非常熟练
4、socket服务端的实现,select和epoll的区别(必问)
5、epoll哪些触发模式,有啥区别?(必须非常详尽的解释水平触发和边缘触发的区别,以及边缘触发在编程中要做哪些更多的确认)
6、大规模连接上来,并发模型怎么设计
7、tcp结束连接怎么握手,time_wait状态是什么,为什么会有time_wait状态?哪一方会有time_wait状态,如何避免time_wait状态占用资源(必须回答的详细)
8、tcp头多少字节?哪些字段?(必问)
9、什么是滑动窗口(必问)
10、connect会阻塞,怎么解决?(必考必问,提示:设置非阻塞,返回之后用select检测状态)
11、如果select返回可读,结果只读到0字节,什么情况?
12、keepalive 是什么东东?如何使用?
13、列举你所知道的tcp选项,并说明其作用。
14、socket什么情况下可读?
六、db:
1、mysql,会考sql语言,服务器数据库大规模数据怎么设计,db各种性能指标