使用select的TCP服务器

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;//设置为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<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;

}

}
}
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值