サーバーとクライアントのコードを書こうとしていて、ある時点で立ち往生しています。クライアントに一定時間読み取りとタイムアウトをさせたい。timeval 構造体で時間を指定する SO_RCVTIMEO で setsockopt() を使用しようとしましたが、私の read() は timeval 構造体で指定した時間を待ちません。つまり、setsockopt() の後に read() を使用した場合、read() は指定された時間だけ待機しています。最初に write() を呼び出してから read() を呼び出すと、read() 関数は、timeval 構造体で指定された時間を待たずにすぐにタイムアウトします。私のコードを以下に示します。
// サンプル クライアント コード
#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<netdb.h>
void error(char *msg)
{
perror(msg);
exit(1);
}
int main(int argc, char *argv[])
{
int a=1;
fd_set readfds,writefds;
int ready_for_reading,reading;
struct timeval time_out;
int sockfd,newsockfd,portno,n;
struct sockaddr_in serv_addr;
struct hostent *server;
// server=gethostbyname(argv[1]);
char buffer[256];
portno=atoi(argv[2]);
sockfd=socket(AF_INET,SOCK_STREAM,0);
server=gethostbyname(argv[1]);
serv_addr.sin_family=AF_INET;
serv_addr.sin_port=htons(portno);
bcopy((char *)server->h_addr,
(char *)&serv_addr.sin_addr.s_addr,
server->h_length);
time_out.tv_sec = 15; // 15 seconds
time_out.tv_usec = 0; // 0 milliseconds
// sockfd=socket(AF_INET,SOCK_STREAM,0);
if(sockfd==-1)
error("\nError creating socket");
// if(setsockopt (sockfd, SOL_SOCKET, SO_RCVTIMEO, (char *)&time_out, sizeof (time_out)))
// error("\n\tsetsockopt function has a problem\n");
n=connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(serv_addr));
if(n==-1)
error("\nError connecting to server");
printf("\nEnter client's msg:");
fgets(buffer,255,stdin);
n=write(sockfd,buffer,strlen(buffer));
if(n<0)
error("\nMsg not written to server");
if(setsockopt (sockfd, SOL_SOCKET, SO_RCVTIMEO, (char *)&time_out, sizeof(time_out)))
error("\n\tsetsockopt function has a problem\n");
// FD_ZERO(&readfds);
// FD_SET(sockfd,&readfds);
n=read(sockfd,buffer,255);
// ready_for_reading=select(sockfd,&readfds,NULL,NULL,&time_out);
// printf("\nready_for_reading=%d",ready_for_reading);
/* if (ready_for_reading)
{
// reading = read(newsockfd, buffer, 255);
printf("Read, %d bytes from input : %s \n", n,buffer);
}
else
{
printf(" 10 Seconds are over - no data input \n");
return 0;
}
*/
if(n<0)
printf("\nMsg not read from server");
if(n==0)
{
printf("\n No ack from server");
return 0;
}
printf("\nServer's ack:%s\n",buffer);
/* if (ready_for_reading)
{
// reading = read(newsockfd, buffer, 255);
printf("Read, %d bytes from input : %s \n", n,buffer);
}
else
{
printf(" 10 Seconds are over - no data input \n");
return 0;
}
*/
return 0;
}
上記のコードでは、read() 操作を 15 秒でタイムアウトさせたいと考えています。しかし、すぐにタイムアウトします。私は助けが必要です!!!