¡Quiero hacer una pregunta sobre la programación de sockets en Linux! Por favor entra
1. En la función de aceptación, el prototipo del tercer parámetro es socklen_t. ¡Al compilar, siempre dice que la conversión entre él e int no es válida! ¿Cómo debería modificarse?
El prototipo de función de a.accept es int Accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen); el último parámetro es de tipo socklen_t. . Por lo tanto, gcc advertirá (g informará un error y g es más estricto)
2. Al compilar, la entrada de la línea de comando es:
./TCPServer (IP del servidor). (número de puerto)
Lo que quiero preguntar es, ¿cómo se reflejan la IP del servidor y el número de puerto en el programa?
¿Está determinado por if(argc!=2)? Es decir, la línea de comando debe generar 2 cadenas.
¿Es posible generar tres cadenas (incluido el número de puerto)? ¿Puede ayudarme algún experto?
a. La IP del servidor está codificada en el programa,
server_addr.sin_addr.s_addr=htonl(INADDR_ANY); elija la dirección IP por sí misma (para el caso de varias IP, el puerto se refleja en esta oración server_addr.sin_port=htons(número de puerto); y el segundo es el número de puerto. Por ejemplo, si el programa que compiló se llama servidor, el comando es servidor 8888 y se puede ejecutar. Tenga en cuenta que el número de argc aquí indica cuántas cadenas hay, incluido el nombre del programa.
4. ¡Se desconoce el alcance de la función close() final!
Debido a que llamaste a la función socket para abrir un descriptor sockfd, debes cerrarlo aquí.
newfd es el descriptor devuelto por su aceptación. Se ha desactivado antes. Los dos son diferentes. sockfd se usa para escuchar y newfd se usa para comunicarse con el par para establecer una conexión.
Además, expuso el archivo de encabezado, por lo que advierte
#include lt;stdlib.hgt;
#include lt;stdio.hgt; p >
#include lt;errno.hgt;
#include lt;string.hgt;
#include lt;netdb.hgt;
# include lt;sys/types.hgt;
#include lt;netinet/in.hgt;
#include lt;sys/socket.hgt;
#define WAITBUF 10
#include lt;unistd.hgt;
#include lt;arpa/inet.hgt;
int main(int argc, char *argv[])
{
int sockfd, new_fd;
struct sockaddr_in server_addr;
struct sockaddr_in client_addr; p >
socklen_t sin_size;
int número de puerto;
char hello[]="¡Hola! Mundo de comunicación de sockets!\n"; argc !=2)
{
fprintf(stderr, "Uso: s número de puerto\a\n", argv[0]);
exit( 1 );
}
/*Número de puerto incorrecto, salida*/
if((portnumber=atoi(argv[1]))lt; 0 )
{
fprintf(stderr, "Uso: s número de puerto\a\n", argv[0]);
exit(1);
p>
}
/*El servidor comienza a crear el descriptor de socket*/
if((sockfd=socket(AF_INET, SOCK_STREAM, 0 ))==-1)
{
fprintf(stderr, "Error de socket: s\n\a", strerror(errno));
exit(1);
p>
}
/*Rellene la estructura sockaddr en el lado del servidor*/
bzero(amp; server_addr, sizeof(struct sockaddr_in));
server_addr .sin_family=AF_INET;
/*Autocompletar IP del host*/
server_addr.sin_addr.s_addr=htonl (INADDR_ANY);
server_addr.sin_port=htons (número de puerto);
/*Enlazar descriptor de sockfd*/
if(bind(sockfd, (struct sockaddr *)(amp; se
rver_addr), sizeof(struct sockaddr))==-1)
{
fprintf(stderr, "Error de enlace: s\n\a", strerror(errno));
exit(1);
}
/*Escuchar el descriptor de sockfd*/
if(listen(sockfd, WAITBUF) ==-1)
{
fprintf(stderr, "Error de escucha: s\n\a", strerror(errno));
exit( 1);
}
while(1)
{
/*El servidor se bloquea hasta que el programa cliente establece una conexión* /
sin_size=sizeof(struct sockaddr_in);
if((new_fd=accept(sockfd, (struct sockaddr *)(amp; client_addr), amp; sin_size))== -1 )
{
fprintf(stderr, "Aceptar error: s\n\a", strerror(errno));
exit(1) ;
}
/*Puedes agregar tu propia función de procesamiento aquí*/
fprintf(stderr, "El servidor obtiene conexión desde s\n",< / p>
inet_ntoa(client_addr.sin_addr));
if(send(new_fd, hola, strlen(hola), 0)==-1)
{< / p>
fprintf(stderr, "Error de escritura: s\n", strerror(errno));
exit(1); p >/*Esta comunicación ha finalizado*/
close(new_fd);
/*Siguiente bucle*/
}
cerrar(sockfd);
salir(0);
}