网络编程基础

1.服务器进程如果需要绑定保留端口号,如80 for HTTP,必须以超级用户运行,否则bind将返回错误:PermissionDenied;
2.每个子进程只有一个父进程,且可以使用函数getppid获取父进程的进程ID;
3.每个父进程可以有多个子进程,且没有函数可以直接获取子进程的进程ID,但是可以通过记录fork返回值的方式获取,如保存在一个数组/链表中;
4.并发服务器的一般实现:
 
  1)调用accept获取客户连接之后调用fork派生子进程,此时父进程中获取的客户套接字、地址结构等均为子进程所共享
    2)子进程使用这个共享的套接字进行数据读写
   3)父进程则直接close这个套接字
5.fork的两个典型用法:
   1)创建自身的副本,这样子进程就可以在这些副本的基础上继续工作,这是网络服务器的典型用法
   2)调用fork之后接着调用exec开启其他程序,这是shell程序的典型用法,如执行ls命令,shell会首先fork一个子进程,然后在子进程中立即调用exec开启ls程序
6.网络应用程序调用close只是将套接字的引用计数减少1,这并不会直接导致内核的TCP层发生4握手的连接终止过程,除非减1后套接字引用变成0
7.与此相反,在一个套接字上面调用shutdown函数则会立即导致TCP连接终止的发生,即开始4次握手协议
8.端口号
    1)众所周知端口号:0-- 1023,unix中的服务器进程必须以超级用户特权运行,否则bind将失败返回
    2)注册端口号:1024-- 49151,向IANA注册的端口号
   3)临时端口号:49152 -- 65535,一般用于客户进程分配临时端口号
9.一个输入操作通常分为两个阶段:
   1)等待内核准备好数据
   2)从内核向进程复制数据
10.unix环境的五种I/O模型
   1)阻塞式I/O:进程阻塞于I/O直到内核与进程之间的数据复制完成
   2)非阻塞式I/O:进程从内核读数据时,如果内核此时没有准备好数据,那么内核将会向进程返回EWOULDBLOCK错误,由进程决定下一步的处理方式,例如再次从内核读数据直到内核准备好数据
   3)I/O复用(select和poll函数):进程阻塞于select或poll调用,直到内核准备好数据,函数返回,进程接着调用读写函数进行数据读写,相比于阻塞式I/O,I/O复用的优势在于,它可以同时等待多个文件描述符,直到其中某个变得可读写
   4)信号驱动式I/O(SIGIO):在SIGIO的信号处理程序中进行数据的读写或者在信号到达时通知主程序进行数据读写
   5)异步I/O(POSIX的aio_系列函数):进程调用异步I/O函数并立即返回,由内核进行异步数据读写,在读写完成时给进程发送通知(通常是在aio_函数中指定的信号),相比于信号驱动式I/O,异步I/O是在内核已经将数据复制到进程缓冲区时才向进程发送信号(前者是在内核准备好数据时发送)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章