1.TCP回射服务器程序:main函数
1 |
|
2.TCP回射服务器程序:str_echo函数
1 | void str_echo(int sockfd) |
3.TCP回射客户程序:main函数
1 |
|
4.TCP回射客户程序:str_cli函数
1 |
|
注意:
使用netstat,ps观察端口状态
5.使用select改进str_cli
因为上面的版本为问题:当套接字发生某些事情,客户可能阻塞于fgets调用,使用select可以避免这个问题。
1 |
|
1.如果对端TCP发送数据,该套接字变为可读,并且read返回一个大于0的值(即读入数据的字节数);
2.如果对端TCP发送一个FIN(对端进程终止),该套接字变为可读,并且read返回0(EOF);
3.如果对端TCP发送一个RST(对端主机崩溃并重新启动),该套接字变为可读,并且read返回-1,errno错误码;
6.信号处理signal函数
1 |
|
处理僵死进程
1 |
|
7.str_cli函数再修改(shutdown)
上一个版本只要服务器关闭它那一端的连接就会通知我们,接下来的版本允许我们正确处理批量输出。
还废弃的以文本行为中心的代码,改为针对缓冲区。
1 |
|
8.TCP回射服务器程序再修改(select)
上一个服务器程序版本(停等版本),是为客户派生一个子进程,处理完再重复为客户派生一个子进程;
接下来的版本使用select来处理任意个客户的单进程程序;
缺点:容易造成拒绝服务型攻击问题,即一个恶意客户发送一个字节数据后进入睡眠,服务器调用read读入该字节后阻塞下一个read调用);
解决方法:
1.使用非阻塞式I/O;
2.每个客户分配一个单独进程;
3.对I/O设置一个超时;
1 | /* include fig01 */ |
9.TCP回射服务器程序再修改(poll)
1 | /* include fig01 */ |