C Linux套接字绑定连接

C Linux套接字绑定连接,c,linux,sockets,C,Linux,Sockets,我正在尝试创建一个聊天室,在那里我有一个服务器和多个客户端,但我有一个问题,当我执行我的服务器代码(serverCHAT.c)时,绑定连接有一个问题。我不知道为什么 当我执行程序时,绑定问题的if语句出现在控制台上 我检查了连接,但找不到错误 #include <sys/types.h> #include <sys/socket.h> #include <pthread.h> #include <stdio.h> #include <neti

我正在尝试创建一个聊天室,在那里我有一个服务器和多个客户端,但我有一个问题,当我执行我的服务器代码(serverCHAT.c)时,绑定连接有一个问题。我不知道为什么

当我执行程序时,绑定问题的if语句出现在控制台上

我检查了连接,但找不到错误

#include <sys/types.h>
#include <sys/socket.h>
#include <pthread.h>
#include <stdio.h>
#include <netinet/in.h>
#include <signal.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>

#define MAX_CLIENT 10

/*
BIBLIOGRAFIA:

https://github.com/yorickdewid/Chat-Server

comando linux ip: ifconfig  es : inet addr
*/



int totcltes=0;
int client_sockfd[MAX_CLIENT];
void *coneccion_clte(void *arg);
int clientes_conectados[MAX_CLIENT];

static unsigned int cli_count = 0;
static int uid = 10;


/* Cliente */
typedef struct {
    struct sockaddr_in addr;    /* Client remote address */
    int connfd;                 /* Connection file descriptor */
    int uid;                    /* Client unique identifier */
    char name[32];              /* Client name */
} client_t;

client_t *clients[MAX_CLIENT];


/* agregar cliente a la cola */
void queue_add(client_t *cl){
    int i;
    for(i=0;i<MAX_CLIENT;i++){
        if(!clients[i]){
            clients[i] = cl;
            return;
        }// if 
    }// for
}// agregar cliente

/* quitar cliente de la cola */
void queue_delete(int uid){
    int i;
    for(i=0;i<MAX_CLIENT;i++){
        if(clients[i]){
            if(clients[i]->uid == uid){
                clients[i] = NULL;
                return;
            }// if 
        }// if
    }// for 
}// quitar cola 

/* Senviar mensaje  */
void enviar_mensaje(char *s){
    int i;
    for(i=0;i<MAX_CLIENT;i++){
        if(clients[i]){
            write(clients[i]->connfd, s, strlen(s));
        }// if 
    }// for 
}// enviar mensaje 



/* Handle all communication with the client */
void *coneccion_clte(void *arg){
    char buff_out[1024];// mensaje de salida
    char buff_in[1024]; // mensaje de entrada
    int rlen;           // longitu del mensaje

    cli_count++;        //aumentamos en uno el cliente 
    client_t *cli = (client_t *)arg;

    printf("Cliente Aceptado %d ", cli->uid);


    /* Recibiendo mensaje  */
    while((rlen = read(cli->connfd, buff_in, sizeof(buff_in)-1)) > 0){
            buff_in[rlen] = '\0';
            buff_out[0] = '\0';


        /* Special options */
        if(strncmp("exit",buff_in,4==0)){
            break;
        }else{
            sprintf(buff_out, "[%s]: %s\n", cli->name, buff_in);
            enviar_mensaje(buff_out);
        }//else
    }//while

    /* Cerrar al conexion */
    close(cli->connfd);

    /* Delete client from queue and yeild thread */
    queue_delete(cli->uid);
    printf("Fin del chat :c ");
    free(cli);
    cli_count--;
    //pthread_detach(pthread_self());
    return NULL;
}//coneccion_clte





int main()
{
    struct sockaddr_in serv_addr;
    struct sockaddr_in cli_addr;
    int server_sockfd ;// listenfd
    //int listenfd = 0; 
    int server_len, client_len;
    struct sockaddr_in server_address;
    struct sockaddr_in client_address;
    //int parametro[MAX_CLIENT];
    //pthread_t tid[MAX_CLIENT];
    //int i;
    pthread_t tid;
    int connfd = 0; //para obtener el descriptor de archivo (connection file descriptor y saber que hilo es)



    /* configuracion del socket*/
    server_sockfd = socket(AF_INET, SOCK_STREAM, 0);
    //listenfd = socket(AF_INET, SOCK_STREAM, 0);
    server_address.sin_family = AF_INET;
    server_address.sin_addr.s_addr = htonl(INADDR_ANY);
    server_address.sin_port = htons(9734);
    server_len = sizeof(server_address);

    /*
    bind()
    Avisa al SO que hemos abierto un socket y asociamos nuestro programa a este socket 
    */
        //bind(server_sockfd,(struct sockaddr *)&server_address,server_len);

    if(bind(server_sockfd, (struct sockaddr *)&server_address,sizeof(serv_addr)) < 0);{
        printf("Error: bind \n");
        //return 1;
    }//if bind 

    /* 
    Crear una cola de conexiones
    Listen 
    Indicamos al programa que empiece a escuchar peticiones y las registre
    */
    if(listen(server_sockfd, 5) < 0){
        printf("Error: Listen");
        //return 1;
    }//is listen


    printf("<[Servidor Inicializado :D]>\n");


    /* Aceptar clientes */
    while(totcltes<MAX_CLIENT){
        connfd = accept(server_sockfd, (struct sockaddr*)&client_address, &client_len);

        /* Revisar el Total de clientes */
        if((cli_count+1) == MAX_CLIENT){
            printf("Clientes Maximos Alcanzados \n");
            close(connfd);
            continue;// para que revise la siguiente iteracion 
        }// if

        /* Configuracion del cliente */
        client_t *cli = (client_t *)malloc(sizeof(client_t));// creamos la estructura cliente cli
        cli->addr = client_address;
        cli->connfd = connfd;
        cli->uid = uid++;
        sprintf(cli->name, "%d", cli->uid);

        /* Agregar clientes a la cola */
        queue_add(cli);
        pthread_create(&tid, NULL, &coneccion_clte, (void*)cli);

    }//while aceptar clientes 
}//main 
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#定义MAX_客户端10
/*
图书馆:
https://github.com/yorickdewid/Chat-Server
comando linux ip:ifconfig es:inet addr
*/
int-totcltes=0;
int client_sockfd[MAX_client];
void*coneccion_clte(void*arg);
国际客户关系[最大客户];
静态无符号整数cliu计数=0;
静态int uid=10;
/*客户*/
类型定义结构{
addr;/*客户端远程地址中的struct sockaddr_*/
int connfd;/*连接文件描述符*/
int uid;/*客户端唯一标识符*/
字符名称[32];/*客户端名称*/
}客户;;
客户机*clients[最大客户机];
/*阿格雷加可乐客户*/
无效队列添加(客户端添加){
int i;
用于(i=0;iuid);
/*雷西比恩多·门萨耶*/
而((rlen=read(cli->connfd,buff_-in,sizeof(buff_-in)-1))>0){
[rlen]='\0'中的buff_;
buff_out[0]='\0';
/*特别选择*/
if(strncmp(“退出”,buff_in,4==0)){
打破
}否则{
sprintf(buff_out,[%s]:%s\n”,cli->name,buff_in);
enviar_mensaje(buff_out);
}//否则
}//当
/*塞拉尔康涅西翁酒店*/
关闭(cli->connfd);
/*从队列和yeild线程中删除客户端*/
队列删除(cli->uid);
printf(“Fin del chat:c”);
免费(cli);
cli_计数--;
//pthread_detach(pthread_self());
返回NULL;
}//康尼西翁酒店
int main()
{
服务地址中的结构sockaddr\u;
cli_addr中的结构sockaddr_;
int server_sockfd;//listenfd
//int listenfd=0;
int server_len,client_len;
服务器地址中的结构sockaddr\u;
客户端地址中的结构sockaddr\u;
//int参数[MAX_CLIENT];
//pthread_t tid[MAX_CLIENT];
//int i;
pthread_t tid;
int connfd=0;//连接文件描述符y saber que hilo es
/*插座配置*/
server\u sockfd=socket(AF\u INET,SOCK\u STREAM,0);
//listenfd=套接字(AF_INET,SOCK_STREAM,0);
服务器地址.sin\u family=AF\u INET;
服务器地址sin\u addr.s\u addr=htonl(INADDR\u ANY);
服务器地址.sin\u端口=htons(9734);
server\u len=sizeof(服务器地址);
/*
绑定()
Avisa al SO que hemos abierto un插座和asociamos nuestro计划a este插座
*/
//绑定(服务器\u sockfd,(结构sockaddr*)和服务器\u地址,服务器\u len);
if(bind(server_sockfd,(struct sockaddr*)和server_地址,sizeof(serv_addr))<0){
printf(“错误:bind\n”);
//返回1;
}//如果绑定
/* 
可口可乐
听
小企业和注册中心的绩效指标
*/
如果(侦听(服务器\u sockfd,5)<0){
printf(“错误:侦听”);
//返回1;
}//就是听
printf(“\n”);
/*Aceptar客户*/
while(totcltesaddr=客户地址;
cli->connfd=connfd;
cli->uid=uid++;
sprintf(cli->name,“%d”,cli->uid);
/*阿格雷加的顾客喝可乐*/
队列添加(cli);
pthread_create(&tid,NULL,&coneccion_clte,(void*)cli);
}//而Aceptor的客户
}//主要
  • 您正在使用
    sizeof(serv\u addr)
    作为长度说明符,而不是
    server\u len
  • 您正在将
    server\u len
    声明为
    int
    :它应该是
    socklen\t

  • 您正在对
    客户端执行相同的操作:它应该是
    socklen\t

  • 请返回并研究githu的原始代码。它实际上是有效的

  • 您正在使用
    sizeof(serv\u addr)
    作为长度说明符,而不是
    server\u len
  • 您正在将
    server\u len
    声明为
    int
    :它应该是
    socklen\t

  • 您正在对
    客户端执行相同的操作:它应该是
    socklen\t


  • 请返回并研究githu的原始代码。它确实有效。

    出错后errno的值是什么?“绑定问题的if语句出现在控制台上”与“我检查连接”一样没有意义,因为如果您遇到绑定问题,您就没有连接。请提供实际的错误消息或
    errno
    ,并且导致它的代码行。你需要使用
    peror()
    ,而不仅仅是
    printf()
    你自己设计的一些消息。如果你从一个系统调用中得到一个错误,不要只是继续,就好像它没有发生一样。还有其他东西在使用那个端口吗?@Pras,在控制台中,出现验证中的prinft(错误:Bind),后者显示“\n”@EdHeal,是的,在我的客户端连接上,我放置了相同的端口出错后errno的值是多少?“控制台上出现绑定问题的if语句”与“我检查连接”一样没有意义,因为如果您遇到绑定问题,您就没有连接。请提供实际的错误消息或
    errno
    ,以及造成它的原因。你需要使用
    perror()
    ,而不仅仅是
    printf()
    你自己设计的一些消息。如果你从系统调用中得到一个错误,不要继续,就好像它没有发生一样。还有什么东西在使用那个端口吗?@Pras,在控制台中,出现验证中的prinft(错误:Bind),后者向我显示“\n”@EdHeal,是的,在我的客户端连接上,我放置了与您所说的相同的端口,并检查了代码,但问题仍然存在,我将尝试以与