代码:
#include <stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<string.h>
#include<unistd.h>
#include<arpa/inet.h>
#include<sys/select.h>
#define ERR_MSG(msg)do{\
fprintf(stderr,"line:__%d__",__LINE__);\
perror("msg");\
}while(0);
#define PROT 8089 //服务器端口
#define IP "192.168.8.168" //服务器IP绑定的IP
#define CIL_PROT 4444 //客户端端口
#define CIL_IP "192.168.8.168" //本机IP,ifconfig;
int main(int argc, const char *argv[])
{
//创建套接字文件
int cfd=socket(AF_INET,SOCK_STREAM,0); //成功返回获取到的文件描述符 失败返回-1;
if(cfd<0)
{
ERR_MSG(socket);
return -1;
}
/*
//bind绑定客户端的ip和接口 非必须绑定,不绑定操作系统随机分配
struct sockaddr_in cil;
cil.sin_family=AF_INET;
cil.sin_port=htons(CIL_PROT);
cil.sin_addr.s_addr=inet_addr(CIL_IP);
if(bind(cfd,(struct sockaddr*)&cil,sizeof(cil))<0)
{
ERR_MSG(bind);
return -1;
}
printf("bind success\n");
*/
//connect链接服务器,填要连接的服务器IP和端口
struct sockaddr_in ser;
ser.sin_family=AF_INET;
ser.sin_port=htons(PROT);
ser.sin_addr.s_addr=inet_addr(IP);
//connect链接服务器
if(connect(cfd,(struct sockaddr*)&ser,sizeof(ser))<0)
{
ERR_MSG(connect);
return -1;
}
printf("connect success\n");
//定义接发数据的数组
char buf[128]="";
ssize_t res=0;
//定义读集合
fd_set readfds,temp;
//初始化集合
FD_ZERO(&readfds);
FD_ZERO(&temp);
//将文件描述符添加到集合中
FD_SET(0,&readfds);
FD_SET(cfd,&readfds);
while(1)
{
//将readfds 的内容复制到temp中
temp=readfds;
//调用slect函数
int sel=select(cfd+1,&temp,NULL,NULL,NULL);
if(sel<0)
{
ERR_MSG(sel);
continue;
}
if(FD_ISSET(0,&temp))
{
//从终端获取
bzero(buf,sizeof(buf));
printf("请输入>>>");
fgets(buf,sizeof(buf),stdin);
buf[strlen(buf-1)]=0;
if(send(cfd,buf,sizeof(buf),0)<0)
{
ERR_MSG(send);
return -1;
}
printf("发送成功\n");
}
else if(FD_ISSET(cfd,&temp))
{
//接受服务器返回的数据
bzero(buf,sizeof(buf));
res=recv(cfd,buf,sizeof(buf),0);
if(res<0)
{
ERR_MSG(recv);
continue;
}
else if(0==res)
{
printf("服务器关闭\n");
//关闭文件描述符
close(cfd);
//去除集合中的文件描述符
FD_CLR(cfd,&readfds);
return -1;
}
else
{
printf("%s\n",buf);
}
}
}
return 0;
}
效果:
