读书人

小弟我设置的发送超时如何没有效果啊

发布时间: 2012-09-14 23:00:48 作者: rapoo

我设置的发送超时怎么没有效果啊?
最近要在linux平台下写一个数据补传的程序,我在程序里设了发送超时3秒钟看数据有没有传送成功。程序运行时,我把网线拔了,怎么send过了将近一分钟才失败?另外我设置socket的阻塞模式,默认应该是阻塞的吧?

下面是我程序中设置超时的部分代码。(有些变量定义我就省略了)

struct timeval TimeOut = { 3, 0 };
int sock;
if((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
{
printf("Failed to create socket!\n");
PRINT_LOG("Failed to create socket!\n");
result = -1;
goto _end;
}
setsockopt( sock, SOL_SOCKET, SO_SNDTIMEO, (char *)&TimeOut, sizeof(TimeOut) ); //设发送超时

bzero(&Server, sizeof(Server));
Server.sin_family = AF_INET;
Server.sin_addr.s_addr = inet_addr(CDMA_ROUTER);
Server.sin_port = htons(PORT);
if(connect(sock, (struct sockaddr*)&Server, sizeof(Server)) < 0)
{
printf("Failed to connect with CDMA_ROUTER!\n");
PRINT_LOG("Failed to connect with CDMA_ROUTER!\n");
fclose( fp );
fclose( fpTemp );
fclose( fpLog );
close( sock );
result = -1;
goto _end;
}

while( 1 )
{
if(send(sock, rbuf1, numSend, 0) != numSend) //发送失败
{
close( sock );
result = -1;
goto _end;
}
}


[解决办法]
你把这句
setsockopt( sock, SOL_SOCKET, SO_SNDTIMEO, (char *)&TimeOut, sizeof(TimeOut) );
的返回值保存打印下,看执行成功了没,还有,超时不都是毫秒么,你的struct timeval TimeOut = { 3, 0 };是什么意思?
[解决办法]

C/C++ code
int TimeOut = 15000;            if (setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (char*)&TimeOut, sizeof(TimeOut))
[解决办法]
通常使用select来设置超时,而不是依赖于描述符的选项,移植性也好

读书人网 >C语言

热点推荐