linux下异步RPC的阶段性总结-非阻塞SOCKET客户端
尽可能使用非阻塞socket int flags, s; flags = fcntl (fd, F_GETFL, 0); if (flags == -1){ close(fd); return -1; } flags |= O_NONBLOCK; s = fcntl (fd, F_SETFL, flags); if (s == -1){ close(fd); return -1; } 使用效率高效的epoll机制获取多个socket上的IN/OUT事件 非阻塞socket连接服务端时,不一定立即连接得上服务器 通过判断connect函数的返回值和错误号做进一步跟踪 int ret = ::connect(this->fd, (struct sockaddr*)&(server_addr), sizeof(server_addr)); if(ret == 0){ this->on_connected(); }else if(ret < 0 && errno != EINPROGRESS){ //error }else{ on_connecting(); } IN/OUT事件时如果是connecting需要判断socket状态,socket reset发生时也会产生事件,然后才进入有效的读写 if(this->connect_status == 1){//connecting int