我正在尝试编写服务器 - 客户端代码,而我却陷入了困境。我希望客户端读取一定的时间和超时。我尝试使用带有SO_RCVTIMEO的setsockopt()来指定timeval结构中的时间,但是我的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秒内超时。但它立即超时。我需要帮助!!!
答案 0 :(得分:1)
如果read
返回零,则表示连接已关闭。没有什么可以等待的,所以它不能等待。
此外,此代码已损坏:
printf("\nServer's ack:%s\n",buffer);
您只能使用%s
格式说明符来打印C样式的字符串。你使用它的方式,它无法知道要打印多少字节,因为它只在代码中的变量n
中保存。