選択に問題があります。
以下は、データを受信するためのコード スニペットです (サーバー側)。
int tcpip_receive_data (int sockfd, char *recv_buffer, int buffer_len, int flags, long sec_timeout)
{
int ret = 0 ;
fd_set fdsock ;
struct timeval timeout = {0x00,} ;
if ((sockfd < 0) || !(recv_buffer) || !(buffer_len))
{
return FAIL ;
}
if (sec_timeout > 0)
{
/* the socket to monitor */
FD_ZERO (&fdsock) ;
FD_SET ((unsigned int) sockfd, &fdsock) ;
/* set a timeout */
timeout.tv_sec = sec_timeout ;
timeout.tv_usec = 0 ;
/* now check whether some data is there or not */
if ((ret = select (sockfd + 1, &fdsock, NULL, NULL, &timeout)) <= 0)
{
printf ("ERROR: Select() retValue[%d] for SockID[%d]%s:%d", ret, sockfd, __FILE__, __LINE__) ;
return FAIL ;
}
else if (ret == 0)
{
printf ("ERROR: Select timed out for SockID[%d]- %s:%d", sockfd, __FILE__, __LINE__) ;
return FAIL ;
}
}
return (recv (sockfd, recv_buffer, buffer_len, flags)) ;
}
以下は、データを送信するための私のコード スニペットです (クライアント側):
int main ( int argc, char **argv )
{
struct sockaddr_in sock_client;
char ip_address [IP_ADDR_LEN] = {0,};
char filename [MAXSTR] = {0,};
int port = 0;
int sock_fd = 0;
FILE *input_fp = NULL;
FILE *output_fp = NULL;
int len = 0, ret = 0;
char data [ BUF_SIZE ] = {0,};
char recv_buffer [ BUF_SIZE ] = {0,};
struct hostent *host;
printf ("%d\n", argc);
if ( argc != 4 )
{
fprintf ( stdout, "<Usage> ./wsp_client <IPAddress> <Port> <DataFilename>\n" );
return 0;
}
strcpy ( ip_address ,argv[1] );
port = atoi ( argv[2] );
strcpy ( filename, argv[3] );
printf ("%s:%d:%s\n", ip_address, port, filename );
if ( ( input_fp = fopen ( filename, "rb" ) ) == NULL )
{
perror ("Input file fopen:");
return 0;
}
if ( ( output_fp = fopen ( "./read_data", "wb" ) ) == NULL )
{
perror ("Outuput fopen:");
return 0;
}
while ( !feof(input_fp) )
{
if ( ( ret = fread ( data, 1, BUF_SIZE, input_fp ) ) < 0 )
{
printf ("fread failed, ferror=[%d] feof=[%d]", ferror (stdin), feof(input_fp));
break ;
}
len += ret;
}
fwrite ( data, sizeof (char), len, output_fp );
fclose ( input_fp );
fclose ( output_fp );
//create a scoket.
if ( ( sock_fd = socket ( AF_INET, SOCK_STREAM, 0 ) ) < 0 )
{
perror ( "Socket Error:" );
return 0;
}
//form the structure.
host = gethostbyname(ip_address);
sock_client.sin_family = AF_INET;
sock_client.sin_port = htons (port);
sock_client.sin_addr = *((struct in_addr *)host->h_addr);
//connect
printf ( "Connecting to port %d\n", port );
if ( connect ( sock_fd, (struct sockaddr *) &sock_client, sizeof ( sock_client ) ) < 0 )
{
perror ( "connect:" );
return 0;
}
printf ("Connection Established\n");
printf ("Sending data of lenght:%d\n", len);
if ( ( ret = send ( sock_fd, data, len, 0 ) ) < 0 )
{
perror ("send:");
return 0;
}
printf ("Sent data of lenght:%d\n", len);
recv (sock_fd, recv_buffer, BUF_SIZE, 0);
close ( sock_fd );
}
問題は、私が作成したクライアント プログラムはデータを送信できますが、サーバーはデータを受信できないことです。しかし、他のクライアントプログラム(実際にはツール)を使用すると、データを送信でき、サーバーはデータを受信して受信したデータを処理できます。
そして、tcpdump から、接続が確立され、クライアントがデータを送信し、サーバーがそれを確認しました (下に貼り付けられた Wriesshark を確認してください)。しかし、サーバーはタイムアウトが発生したことを示すログを提供しています。
ソケットにデータが存在する場合、select が起動しないのはなぜですか。タイムアウトになっている理由。
問題を整理するのを手伝ってください。