使用select的TCP服务器

select函数详解

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include
#include
#include 
#include 
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;//设置为IP通信
serveraddr.sin_port =htons(1234);//服务器端口号
serveraddr.sin_addr.s_addr = INADDR_ANY;//服务器IP地址
//serveraddr.sin_addr.s_addr = inet_addr("127.0.0.1");//服务器IP地址

 /*将套接字绑定到服务器的网络地址上*/
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
#include
#include
#include
#include
#include
#include
#include
#include
#include 
#include 
#include 
#include
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;

}

}
}
}

你可能感兴趣的:(tcp/ip,服务器,网络协议)