Todo se compila sin errores y advertencias. Yo inicie el programa. Yo visite localhost:8080 y el programa se detiene – gran. Yo intente ejecutar de nuevo el programa y me sale Error: no se puede enlazar mensaje. ¿Por qué?

Código:

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define PORT 8080
#define PROTOCOL 0
#define BACKLOG 10
int main()
{
int fd;
int connfd;
struct sockaddr_in addr; //For bind()
struct sockaddr_in cliaddr; //For accept()
socklen_t cliaddrlen = sizeof(cliaddr);
//Open a socket
fd = socket(AF_INET, SOCK_STREAM, PROTOCOL);
if (fd == -1) {
printf("Error: unable to open a socket\n");
exit(1);
}
//Create an address
//memset(&addr, 0, sizeof addr);
addr.sin_addr.s_addr = INADDR_ANY;
addr.sin_family = AF_INET;
addr.sin_port = htons(PORT);
if ((bind(fd, (struct sockaddr *)&addr, sizeof(addr))) == -1) {
printf("Error: unable to bind\n");
printf("Error code: %d\n", errno);
exit(1);
}
//List for connections
if ((listen(fd, BACKLOG)) == -1) {
printf("Error: unable to listen for connections\n");
printf("Error code: %d\n", errno);
exit(1);
}
//Accept connections
connfd = accept(fd, (struct sockaddr *) &cliaddr, &cliaddrlen);
if (connfd == -1) {
printf("Error: unable to accept connections\n");
printf("Error code: %d\n", errno);
exit(1);
}
//read(connfd, buffer, bufferlen);
//write(connfd, data, datalen);
// close(connfd);
return 0;
}
  • printf("Error code: %d\n", errno); (o utilice perror o strerror() ) por CIERTO: el primer printf() probablemente podría restablecer errno. BTW2: salida de diagnóstico debe ir a stderr.
  • whoopsie! Gracias @wildplasser
  • Y el error que se obtiene en el segundo tiempo es, probablemente, «EADDRINUSE dirección ya está en uso» ?
  • OT: Es int main(void) al menos.
InformationsquelleAutor chuckfinley | 2014-03-02

4 Comentarios

  1. 2

    Con el fin de averiguar por qué, usted necesita para imprimir el error; la razón más probable es que ya está utilizando otro programa el puerto (netstat puede decir).

    Su impresión problema es que C cadenas de formato de uso %, no &. Reemplazar el carácter en la cadena de impresión, y se debe trabajar.

  2. 0

    Primero, echa un vistazo en el siguiente ejemplo:
    Servidor De Socket Ejemplo

    Segundo: la razón por La que la segunda se unen no es, debido a que su aplicación se estrelló, el zócalo está destinado para un número de segundos o incluso minutos.

    Comprobar con el «netstat» comando si la conexión sigue abierta.

  3. 0

    Tratar de poner el siguiente código justo antes de bind()

    int opt = 1;
    if (setsockopt(<Master socket FD>, SOL_SOCKET, SO_REUSEADDR, (char *)&opt, sizeof(opt))<0) {perror("setsockopt");exit(EXIT_FAILURE);}if(setsockopt(<Master socket FD>, SOL_SOCKET, SO_REUSEPORT, (char *)&opt, sizeof(opt))<0) {
    perror("setsockopt");exit(EXIT_FAILURE);}

    Razón detrás de socket error de enlace 98:

    Socket es de 4 tupla (ip del servidor, puerto del servidor , cliente ip, puerto del cliente)
    Cuando cualquiera de los dos zócalos de tuplas partidos , error 98 se produce
    Cuando se termina el código en el lado del servidor, esto significa que usted está terminando la conexión con el cliente tcp .
    Ahora el servidor es el que envía fin a cliente y pasa a estado TIME_WAIT.
    Normalmente , en el estado TIME_WAIT servidor envía los paquetes ack continuamente al cliente , asumiendo que si cualquier ack se pierde en el medio .
    Tiempo de espera depende de la implementación de código . Podría ser de 30 segundos a 2 minutos o más.

    Si usted vuelva a ejecutar el código , el servidor está en TIME_WAIT , hecne puerto ya está en uso . Esto es debido a que cualquier servicio que se ejecuta en el servidor utiliza el puerto fijo que no es el caso con el cliente .

    Es por eso que en la vida real, el servidor nunca le enviará un fin para el cliente .Es el cliente que envía fin para terminar la conexión.
    Incluso si el cliente se conecta de nuevo antes de tiempo de espera de TIME_WAIT, él va a estar conectado al servidor , ya que, él va a usar ahora un puerto diferente por lo tanto zócalo de la tupla cambios .
    Si se implementa en forma inversa , si el servidor envía fin , no después de cualquier nueva conexión no sería aceptar hasta el tiempo de espera finaliza .

    Por qué puerto está ocupado ?
    Es porque en TIME_Wait , el que envía la ALETA en primer lugar, debe transmitir los paquetes ack de forma continua hasta que tiempo de espera se agota.

Dejar respuesta

Please enter your comment!
Please enter your name here