Код тестируется на виртуалке. Выдаёт IP клиента которого вообще нет.
Правильно ли я получаю IP и порт клиента? Подключался и из физической сети, и с другой консоли на этой же виртуалке FreeBSD.Код сервера:
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>int main( void )
{
struct sockaddr_in local, ext;
int s;
int s1;
int rc;
int extlen;
char buf[1];
local.sin_family = AF_INET;
local.sin_port = htons( 9000 );
local.sin_addr.s_addr = htonl( INADDR_ANY );
s = socket( AF_INET, SOCK_STREAM, 0 );
if ( s < 0 )
{
perror( "ошибка вызова socket" );
exit( 1 );
}
rc = bind( s, (struct sockaddr *)&local, sizeof( local ) );
if ( rc < 0 )
{
perror( "ошибка вызова bind" );
exit( 1 );
}
rc = listen( s, 5 );
if ( rc )
{
perror( "ошибка вызова listen" );
exit( 1 );
}
// s1 = accept( s, NULL, NULL );
s1 = accept(s,(struct sockaddr *)&ext, &extlen);
if ( s1 < 0 )
{
perror( "ошибка вызова accept" );
exit( 1 );
}
printf("Порт источника %d\n",htons((struct sockaddr_in *)&ext.sin_port));
printf("Адрес источника %s\n",inet_ntoa((struct sockaddr_in *)&ext.sin_addr));
rc = recv( s1, buf, 1, 0 );
if ( rc <= 0 )
{
perror( "ошибка вызова recv" );
exit( 1 );
}
printf( "%c\n", buf[0] );
rc = send( s1, "2", 1, 0 );
if ( rc <= 0 )perror( "ошибка вызова send" );
exit( 0 );
}