1.select客户端代码
#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<strings.h>
#include<sys/select.h>
#include<sys/time.h>
#include<sys/unistd.h>
#include<string.h>
#define PORT 40000
#define IP "192.168.0.103"
#define ERR_MSG(msg) do{\
printf("line:%d\n",__LINE__);\
perror(msg);\
}while(0)
int main(int argc, const char *argv[])
{
//创建套接字
int sfd=socket(AF_INET,SOCK_STREAM,0);//IPV4协议族,TCP传输层协议,返回文件描述符
if(sfd<0)
{
ERR_MSG("socket");
return -1;
}
printf("socket is success sfd=%d %d\n",sfd,__LINE__);
struct sockaddr_in sin;
sin.sin_family=AF_INET;//IPV4协议族
sin.sin_port=htons(PORT);//端口的网络字节序
sin.sin_addr.s_addr=inet_addr(IP);//IP的网络字节序
if(connect(sfd,(struct sockaddr*)&sin,sizeof(sin))<0)//将IP和端口绑定至套接字
{
ERR_MSG("connect");
return -1;
}
printf("connect is success:%d\n",__LINE__);
//创建集合
fd_set readfds,tempfds;
//fd_set是一个结构体,将其清空
FD_ZERO(&readfds);
FD_ZERO(&tempfds);
//文件描述符放入集合中
FD_SET(0,&readfds);
FD_SET(sfd,&readfds);
ssize_t res=0;
int s_res=0;
char str[128]="";
char buf[128]="";
while(1)
{
tempfds=readfds;
s_res=select(sfd+1,&tempfds,NULL,NULL,NULL);
if(s_res<0)
{
ERR_MSG("select");
return -1;
}
else if(0==s_res)
{
printf("超时了.....\n");
break;
}
//标示文件描述符准备就绪
//判断哪个文件描述符,准备好走对应的函数即可
if(FD_ISSET(0,&readfds))
{
printf("键盘输入时间\n");
fgets(buf,sizeof(buf),stdin);
buf[strlen(buf)-1]=0;
if(send(sfd,buf,sizeof(buf),0)<0)
{
ERR_MSG("send");
return -1;
}
printf("send is success\n");
}
if(FD_ISSET(sfd,&readfds))
{
printf("触发服务器交互时间\n");
bzero(str,sizeof(str));
res=recv(sfd,str,sizeof(str),0);
if(res<0)
{
ERR_MSG("recv");
return -1;
}
else if(res==0)
{
printf("服务器下线\n");
break;
}
printf("接收成功:%s %d\n",str,__LINE__);
}
}
close(sfd);
return 0;
}
2.poll客户端代码
#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<netinet/in.h>
#include<strings.h>
#include<string.h>
#include<poll.h>
//创建报警定义
#define ERR_MSG(msg) do{\
printf("line:%d\n",__LINE__);\
perror(msg);\
}while(0)
#define PORT 40000
#define IP "192.168.10.187"
int main(int argc, const char *argv[])
{
//创建套接字
int sfd=socket(AF_INET,SOCK_STREAM,0);//ipv4协议族,TCP传输协议,返回套接字
if(sfd<0)
{
ERR_MSG("socket");
return -1;
}
printf("socket is success%d\n",__LINE__);
//给结构体赋值
struct sockaddr_in cin;
cin.sin_family=AF_INET;
cin.sin_port=htons(PORT);
cin.sin_addr.s_addr=inet_addr(IP);
socklen_t len=sizeof(cin);
if(connect(sfd,(struct sockaddr*)&cin,len)<0)
{
ERR_MSG("connect");
return -1;
}
printf("connect is success%d\n",__LINE__);
struct pollfd fds[2];//创建集合
fds[0].fd=0;//指定监测0号
fds[0].events=POLLIN;//监测0号文件描述符对应的空间是可读
fds[0].fd=sfd;//指定监测sfd
fds[0].events=POLLIN;//监测sfd文件描述符对应的空间是可读
char str[128]="";
char buf[128]="";
ssize_t res=0;
int p_res=0;
while(1)
{
//组方式监测集合
p_res=poll(fds,2,-1);
if(p_res<0)
{
ERR_MSG("poll");
return -1;
}
else if(0==p_res)
{
printf("time out....\n");
break;
}
//发送数据
if(fds[0].revents&POLLIN)//0是否有POLLIN事件
{
bzero(buf,sizeof(buf));
printf("发送数据>>>>");
fgets(buf,sizeof(buf),stdin);
buf[strlen(buf)-1]=0;
if(send(sfd,buf,sizeof(buf),0)<0)
{
ERR_MSG("send");
return -1;
}
printf("发送成功\n");
}
//接收数据
if(fds[1].revents&POLLIN)//sfd是否有POLLIN事件
{
bzero(str,sizeof(str));
res=recv(sfd,str,sizeof(str),0);
if(res<0)
{
ERR_MSG("recv");
return -1;
}
else if(res==0)
{
break;
}
printf("sfd:%d str:%s\n",sfd,str);
printf("接收成功\n");
}
}
//关闭套接字
if(close(sfd)<0)
{
ERR_MSG("close");
return -1;
}
return 0;
}