问题:实现客户端与服务器的双向通信 一般需要开启两个线程 两个while循环实现
使用多路复用即可解决这个问题 减少系统资源的使用
#include <stdio.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <string.h>
#include <arpa/inet.h>
/* According to POSIX.1-2001, POSIX.1-2008 */
#include <sys/select.h>
/* According to earlier standards */
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
int main(int argc, char const *argv[])
{
// 1.创建
int tcp_socket = socket(AF_INET, SOCK_STREAM, 0);
// 2.设置服务器地址
struct sockaddr_in ser_addr;
ser_addr.sin_family = AF_INET; // IPV4
ser_addr.sin_port = htons(6667); //采用大端序
ser_addr.sin_addr.s_addr = inet_addr("192.168.0.105"); //自动绑定本地网卡地址
int ret = connect(tcp_socket, (struct sockaddr *)&ser_addr, sizeof(ser_addr));
// 4.接收链接请求
while (1)
{
// 设置套接字集合,并清零
fd_set set;
FD_ZERO(&set); // 清零
FD_SET(tcp_socket, &set);//网络描述符
FD_SET(0, &set);//标准输入设备
printf("开始selec检测\n");
// 调用select(),同时多路监控以上三种阻塞状态
ret = select(tcp_socket + 1, &set, NULL, NULL, NULL);
if (ret < 0)
{
perror("");
}else{
printf("有活跃描述符\n");
}
//抓出活跃的描述符
if(FD_ISSET(tcp_socket, &set))
{
printf("网络 socket 活跃\n");
char buf[1024] = {0};
read(tcp_socket,buf,1024);
printf("%s\n",buf);
}
if(FD_ISSET(0, &set))//标准输入
{
printf("标准输入 活跃\n");
char buf[1024] = {0};
scanf("%s", buf);
write(tcp_socket, buf , strlen(buf));
}
}
return 0;
}
效果: