C Linux套接字绑定连接
我正在尝试创建一个聊天室,在那里我有一个服务器和多个客户端,但我有一个问题,当我执行我的服务器代码(serverCHAT.c)时,绑定连接有一个问题。我不知道为什么 当我执行程序时,绑定问题的if语句出现在控制台上 我检查了连接,但找不到错误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
#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
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,是的,在我的客户端连接上,我放置了与您所说的相同的端口,并检查了代码,但问题仍然存在,我将尝试以与