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;

}*

posted @   codebuilder  阅读(78)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示