J'ai récemment rencontré des problèmes pour établir un tunnel SSH. Il s'est avéré que ni Apache ni Nginx ne se lient à aucun port (même en tant que root et/ou en dehors de la plage <1024). À partir de aquí J'ai obtenu un petit programme de test (juste en dessous Exemple de code (ma version avec les résultats ci-dessous), en espérant pouvoir trouver l'erreur. Cependant, en exécutant ./server 6789
y ./client localhost 6789
(dans deux terminaux sur la même machine) ne donne aucune erreur. Il n'y a simplement pas de connexion, donc server
blocs dans accept()
:
Server:
socket().
bzero().
htons().
bind().
listen().
Client:
socket().
gethostbyname().
bzero().
bcopy().
htons().
ERROR connecting: Connection timed out
Les déclarations de sortie sont les miennes. Ce sont les seules choses que j'ai modifiées, elles sont imprimées après chaque commande réussie.
Apache et Nginx se comportent de la même manière, vous ne pouvez simplement pas vous connecter au serveur. Cependant, avec SSH, il y a une erreur :
$ ssh -4 -vvv -NL 5901:"$server":5901 "$user@$server"
[...]
debug1: Authentication succeeded (publickey).
Authenticated to <server> ([<ip>]:22).
debug1: Local connections to LOCALHOST:5901 forwarded to remote address <server>:5901
debug3: channel_setup_fwd_listener_tcpip: type 2 wildcard 0 addr NULL
debug1: Local forwarding listening on 127.0.0.1 port 5901.
bind: Cannot assign requested address
channel_setup_fwd_listener_tcpip: cannot listen to port: 5901
Could not request local forwarding.
debug2: fd 3 setting TCP_NODELAY
debug3: ssh_packet_set_tos: set IP_TOS 0x10
debug1: Requesting no-more-sessions@openssh.com
(Sans -4
le résultat est légèrement différent mais fondamentalement le même).
Anki se comporte de la même manière :
$ anki
Exception in thread Thread-1:
Traceback (most recent call last):
File "threading.py", line 916, in _bootstrap_inner
File "aqt/mediasrv.py", line 57, in run
File "socketserver.py", line 453, in __init__
File "aqt/mediasrv.py", line 38, in server_bind
File "socketserver.py", line 467, in server_bind
OSError: [Errno 99] Cannot assign requested address
Vous avez une idée de ce qui se passe ici ou de la façon dont je pourrais trouver l'erreur ?
Avec Devuan Jessie, cela a fonctionné, ainsi que sur un autre PC exécutant Devuan ASCII. J'ai déjà vérifié s'il ne manquait pas un paquet qui est présent sur les autres installations, mais je n'ai rien trouvé qui semble pertinent (je dispose de netbase
).
Merci !
server.cpp :
/* A simple server in the internet domain using TCP
The port number is passed as an argument */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
void error(const char *msg)
{
perror(msg);
exit(1);
}
int main(int argc, char *argv[])
{
puts("Server:");
int sockfd, newsockfd, portno;
socklen_t clilen;
char buffer[256];
struct sockaddr_in serv_addr, cli_addr;
int n;
if (argc < 2) {
fprintf(stderr,"ERROR, no port provided\n");
exit(1);
}
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0)
error("ERROR opening socket");
puts("socket().");
bzero((char *) &serv_addr, sizeof(serv_addr));
puts("bzero().");
portno = atoi(argv[1]);
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;
serv_addr.sin_port = htons(portno);
puts("htons().");
if (bind(sockfd, (struct sockaddr *) &serv_addr,
sizeof(serv_addr)) < 0)
error("ERROR on binding");
puts("bind().");
listen(sockfd,5);
puts("listen().");
clilen = sizeof(cli_addr);
newsockfd = accept(sockfd,
(struct sockaddr *) &cli_addr,
&clilen);
if (newsockfd < 0)
error("ERROR on accept");
puts("accept().");
bzero(buffer,256);
n = read(newsockfd,buffer,255);
if (n < 0) error("ERROR reading from socket");
printf("Here is the message: %s\n",buffer);
n = write(newsockfd,"I got your message",18);
if (n < 0) error("ERROR writing to socket");
close(newsockfd);
close(sockfd);
return 0;
}
client.cpp :
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
void error(const char *msg)
{
perror(msg);
exit(0);
}
int main(int argc, char *argv[])
{
puts("Client:");
int sockfd, portno, n;
struct sockaddr_in serv_addr;
struct hostent *server;
char buffer[256];
if (argc < 3) {
fprintf(stderr,"usage %s hostname port\n", argv[0]);
exit(0);
}
portno = atoi(argv[2]);
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0)
error("ERROR opening socket");
puts("socket().");
server = gethostbyname(argv[1]);
if (server == NULL) {
fprintf(stderr,"ERROR, no such host\n");
exit(0);
}
puts("gethostbyname().");
bzero((char *) &serv_addr, sizeof(serv_addr));
puts("bzero().");
serv_addr.sin_family = AF_INET;
bcopy((char *)server->h_addr,
(char *)&serv_addr.sin_addr.s_addr,
server->h_length);
puts("bcopy().");
serv_addr.sin_port = htons(portno);
puts("htons().");
if (connect(sockfd,(struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0)
error("ERROR connecting");
printf("Please enter the message: ");
bzero(buffer,256);
fgets(buffer,255,stdin);
n = write(sockfd,buffer,strlen(buffer));
if (n < 0)
error("ERROR writing to socket");
bzero(buffer,256);
n = read(sockfd,buffer,255);
if (n < 0)
error("ERROR reading from socket");
printf("%s\n",buffer);
close(sockfd);
return 0;
}