1、运行1个服务器和2个客户端
实现效果:
1、服务器和2个客户端互相聊天,服务器和客户端都需要使用select模型去实现
2、服务器要监视2个客户端是否连接,2个客户端是否发来消息,以及服务器自己的标准输入流
3、客户端要监视服务器是否发来消息,以及客户端自己的标准输入流
4、在不开线程的情况下,实现互相聊天
小计:实现的结果是服务器能够同时和多个客户端进行通信,但是客户端之间不能进行通信
//Ser.c
#include <myhead.h>
#define SER_IP "192.168.2.7" // 服务器IP
#define SER_PORT 8888 // 服务器端口号
int main(int argc, const char *argv[])
{
// 1、创建用于监听的套接字
int sfd = -1;
sfd = socket(AF_INET, SOCK_STREAM, 0);
// 参数1:表示使用的是ipv4的通信
// 参数2:表示使用tcp通信类型
// 参数3:表示前面已经特定了通信协议
if (sfd == -1)
{
perror("socket error");
return -1;
}
printf("sfd = %d\n", sfd); // 3
// 将端口号快速重用
int reuse = 1;
if (setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) == -1)
{
perror("setsockopt error");
return -1;
}
printf("端口号快速重用成功\n");
// 2、绑定ip地址和端口号
// 2.1填充地址信息结构体
struct sockaddr_in sin;
sin.sin_family = AF_INET; // 地址族
sin.sin_port = htons(SER_PORT); // 端口号
sin.sin_addr.s_addr = inet_addr(SER_IP); // IP地址
// 2.2绑定
if (bind(sfd, (struct sockaddr *)&sin, sizeof(sin)) == -1)
{
perror("bind error");
return -1;
}
printf("bind success\n");
// 3、启动监听,允许客户端连接
if (listen(sfd, 128) == -1)
{
perror("listen error");
return -1;
}
printf("listen success\n");
// 4、当有客户端发来连接请求后创建新的用于通信的套接字
// 如果不想接收客户端地址信息结构体,则无需传入参数2和参数3