非阻塞select下载
链接:https://pan.baidu.com/s/1v3wuohyelqGFIRVbUAJ4sg 密码:49vw
select_client客户端
//
// main.cpp
// 111
//
// Created by LXBig on 18/4/9.
// Copyright © 2018年 LXBig. All rights reserved.
//
#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <unistd.h>
#define BUF_SIZE 1024
#include <fcntl.h>
#include <sys/select.h>
#include<sys/ioctl.h>
#include <sys/types.h>
#include <errno.h>
#include <unistd.h>
//客户端
void setNonBlock(int s,bool noblock)
{
/*
1、获取文件的flags,即open函数的第二个参数:
flags = fcntl(fd,F_GETFL,0);
2、设置文件的flags:
fcntl(fd,F_SETFL,flags);
3、增加文件的某个flags,比如文件是阻塞的,想设置成非阻塞:
*/
int flags = fcntl(s, F_GETFL,&noblock);
flags |= O_NONBLOCK;
fcntl(s,F_SETFL,flags);
}
#define PEER_IP "127.0.0.1"
#define PEER_PORT 1234
void select_sock_client()
{
int ret = 0;
int sock_fd;
struct sockaddr_in addr;
sock_fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
setNonBlock(sock_fd, true);
memset(&addr, 0, sizeof(sockaddr));
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr("127.0.0.1");
addr.sin_port = htons(1234);
int res = connect(sock_fd, (struct sockaddr*)&addr, sizeof(addr));
if (res == 0) {
printf("socket connect succeed immediately.\n");
ret = 0;
}
else
{
printf("get the connect result by select().\n");
if (errno == EINPROGRESS) //EINPROGRESS: Operation now in progress(套接字为非阻塞套接字,且连接请求没有立即完成)
{
int times = 0;
while (true)
{ <