day11wufu
*#include <stdio.h>
include <string.h>
include <sys/types.h>
include <sys/socket.h>
include <netinet/in.h>
include <arpa/inet.h>
include <netinet/ip.h>
include <unistd.h>
include <sys/wait.h>
include <stdlib.h>
include <pthread.h>
define PORT 8080
define IP "192.168.11.100"
define NUM 5
typedef struct sockaddr SA;
typedef struct sockaddr_in SIN;
int len=sizeof(SIN);
int fd[NUM];
/*
服务端和客户端之间正常通信
服务端
*/
void *talk(void *arg)
{
long num=(long)arg;//数据转换,不转换有时候会出错
char buf[100]={0};
while(1)//数据的传输和发送
{
memset(buf,0,100);//接受数据之前清空里面的内容
recv(fd[num],buf, 100, 0);
if(strncmp("quit",buf,4) == 0)//服务器接收到客户端发来的退出信息
{
send(fd[num], buf, strlen(buf), 0);//退出之前,给法信息的一端发送退出信息
break;
}
for(int i=0;i<NUM;i++)//判断是不是发送人,有没有连接
{
if(fd[i] != 0 && fd[i] != fd[num])//fd[i]==0说明这个位置还没人连接,等于fd[num]说明他是发送的人
{
send(fd[i], buf, strlen(buf), 0);//发送接收到的数据给其他以连接的人
}
}
}
fd[num]=0;//客户下线之后把这个位置空出来,下次使用
pthread_exit(NULL);
}
int main(int argc,char *argv[])
{
pthread_t tid[NUM];
//1、创建socket套接字文件 socket()
int sockfd=socket(AF_INET, SOCK_STREAM, 0);
if(sockfd == -1)
{
perror("socket create fai;ure\r\n");
return 0;
}
//2、创建结构体变量,初始化信息 struct socksddr端口号和IP写在一起 struct socksddr_in
SIN ser_addr;
ser_addr.sin_family=AF_INET;
ser_addr.sin_port=htons(PORT);
ser_addr.sin_addr.s_addr=inet_addr(IP);
//3、绑定端口号和IP地址 bind()
if(bind(sockfd, (SA *)&ser_addr,len) == -1)
{
perror("IP and PORT bind failure\r\n");
return 0;
}
//4、创建监听队列listen()
if(listen(sockfd, NUM) ==-1)
{
perror("crate listen failure\r\n");
return 0;
}
printf("等待客户连接...\r\n");
while(1)
{
//5、等待客户端连接 accpet()
SIN cli_addr;
memset(&cli_addr,0,len);
int cli_fd=accept(sockfd, (SA *)&cli_addr, &len);//等待用户连接,是阻塞等待
if(cli_fd == -1)
{
perror("accept failure\r\n");
return 0;
}
for(long i=0;i<NUM;i++)//循环判断fd数组里面那个没有值,判断谁没有被连接
{
if(fd[i] == 0)//找到有空闲的位置
{
fd[i]=cli_fd;//保存客户端的文件描述符,fd数组是全局变量
printf("连接成功!!!\r\n");
pthread_create(&tid[i], NULL, talk, (void *)i);//创建线程去和客户端对话
pthread_detach(tid[i]);//非阻塞等待线程退出
break;
}
}
}
//关闭文件
for(int i=0;i<NUM;i++)
{
if(fd[i] > 0)
{
close(fd[i]);
}
}
close(sockfd);
return 0;
}*
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)