select函数详解
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <iostream>
#include<sys/select.h>
#include<sys/epoll.h>
#include <fcntl.h>
#include <errno.h>
using namespace std;
#define MAX_EVENTS 1024
#define READ_BUFFER 1024
int setnonblocking(int fd)
{
fcntl(fd,F_SETFL,fcntl(fd,F_GETFL) | O_NONBLOCK);
}
int main()
{
int sockfd;
sockfd = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
sockaddr_in serveraddr = {};
serveraddr.sin_family = AF_INET;
serveraddr.sin_port =htons(1234);
serveraddr.sin_addr.s_addr = INADDR_ANY;
bind(sockfd,(sockaddr*)&serveraddr,sizeof(serveraddr));
listen(sockfd,SOMAXCONN);
socklen_t clnt_addr_len = sizeof(serveraddr);
fd_set r_set;
FD_ZERO(&r_set);
sockaddr_in clientaddr;
socklen_t naddrlen;
naddrlen = sizeof(sockaddr_in);
int _csock;
int maxfd = _csock;
_csock = accept(sockfd,(sockaddr*)&clientaddr,&naddrlen);
while (1)
{
FD_SET(_csock,&r_set);
FD_SET(0,&r_set);
int nready;
nready = select(maxfd+1,&r_set,NULL,NULL,NULL);
if(nready){
if (FD_ISSET(_csock,&r_set))
{
char revdate[255] = {0};
int ret = recv(_csock,revdate,256,0);
cout<<"收到服务端信息:"<<revdate<<endl;
}
if (FD_ISSET(0,&r_set))
{
char sw[30];
cin>>sw;
cin.clear();
cin.sync();
send(_csock,sw,strlen(sw),0);
}
}
}
}
client客户端
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<netdb.h>
#include<unistd.h>
#include <iostream>
#include <sys/un.h>
#include <arpa/inet.h>
#include<fstream>
using namespace std;
int main()
{
int socketclient;
socketclient = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
sockaddr_in clientaddr = {};
clientaddr.sin_family = AF_INET;
clientaddr.sin_port = htons(4444);
clientaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
connect(socketclient,(sockaddr*)&clientaddr,sizeof(sockaddr_in));
fd_set r_set;
int maxfd = socketclient;
FD_ZERO(&r_set);
while (1)
{
FD_SET(socketclient,&r_set);
FD_SET(0,&r_set);
int nready;
nready = select(maxfd+1,&r_set,NULL,NULL,NULL);
if(nready)
{
if(FD_ISSET(0,&r_set)){
char sw[30];
cin>>sw;
cin.clear();
cin.sync();
send(socketclient,sw,strlen(sw),0);
}
if (FD_ISSET(socketclient,&r_set))
{
char recvbuf[1024] = {0};
int nlen = recv(socketclient,recvbuf,1024,0);
cout<<recvbuf<<endl;
}
}
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)