网络编程中的注意问题

Socket和accept,成功返回非0,失败返回-1
Bind,connect,listen,成功为0,失败返回-1

1、 客户端正常终止
客户端发送FIN, 服务器端状态close_wait,客户端状态fin_wait_2,收到服务器端的FIN,发送ACK,进入time_wait状态


并发式服务器中,收到一个连接请求,fork一个进程来处理,当客户端结束后,子进程结束,发送sigchld信号给父进程,但是父进程没有捕捉这个信号,会出现僵尸进程,需要有signal处理函数来捕捉这个信号。

处理子进程退出的两个函数:
#include <sys/wait.h>
Pid_t wait(int *statloc);
Pid_t waitpid(pid_t pid, int *statloc, int options)
正确处理子进程退出的方法:
While((pid = waitpid(-1, &stat, WNOHANG) ) > 0)  {
    //语句
}

Accept返回前连接夭折
三次握手完成,连接建立,然后,客户TCP发一个RST。在服务器端,等待服务器进程在RST到达后调用 accept。
这个过程可以通过下面方式模拟:
1、启动服务器,调用socket,bind和listen,然后在调用accept之前睡眠一小段时间
2、 在服务器进程睡眠时,启动客户,调用socket和connect,一旦connect返回,设置套接口选项SOL_LINGER以生成RST,然后终止。


I/O复用
1、 select函数
其原型为
#include <sys/select.h>
#include <sys/time.h>
int select(int maxfdp1, fd_set *readset, fd_set *writeset, fd_set *exceptset, const struct timeval *timeout)
结构体timeval定义为:
struct timeval {
        long tv_set;
        long tv_usec;
};
如果进程捕获了一个信号并从信号处理程序返回 ,那么等待一般被中断,select返回EINTR错误
函数select使用描述字集,它一般是一个整数数组,第个数中的每一位对应一个描述字,例如,用32位整数,则数组的第一个元素对应于搭述字0-31,数组中的第二个元素对应于描述字32-63,以此类推。与fd_set相关的宏
void FD_ZERO(fd_set *fdset);   //clear all bits in fdset
void FD_SET(int fd, fd_set *fdset);//turn on the bit for fd in fdset
void FD_CLR(int fd, fd_set *fdset);//turn off the bit for fd in fdset
void FD_ISSET(int fd, fd_set *fdset);//is the bit for fd on in fdset
参数maxfdp1指定被测试的描述字个数,它的值是要被测试的最大描述字加1,描述字0,1,2….一直到maxfdp1-1均被测试。


套接口准备好读有四个条件:
(1)套接口接收缓冲区中的数据字节数大于等于套接口接收缓冲区低潮限度的当前值

(2)连接的读这一半关闭(接收了FIN的TCP连接),对这样的套接口的读操作将不阻塞且返回0

(3)套接口是一个监听套接口且已完成的连接数为非0

(4)有一个套接口错误待处理。对这样的套接口的读操作将不阻塞且返回一个错误


套接口准备好写有3个条件:
(1)套接口发送缓冲区中的可用空间字节数大于等于套接口发送缓冲区低潮限度的当前值。如果将套接口设置 为非阻塞,写操作将不阻塞且返回一个正值

(2)连接的写这一半关闭

(3)有一个套接口错误待处理


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kgduu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值