gpt4 book ai didi

c - Linux套接字绑定(bind)连接

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:18:45 25 4
gpt4 key购买 nike

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

当我执行程序时,控制台出现绑定(bind)问题的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

最佳答案

  1. 您正在使用 sizeof(serv_addr) 作为长度说明符而不是 server_len
  2. 您将 server_len 声明为 int:它应该是 socklen_t

  3. 您正在对 client_len 做同样的事情:它应该是 socklen_t

请回去研究githu的原始代码。它实际上有效。

关于c - Linux套接字绑定(bind)连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46923500/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com