阻塞socket时,SO_RCVTIMEO不起作用?急,在线等。 本帖最后由 oyljerry 于 2011-06-03 13:31:17 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 m_hSocket = socket(AF_INET, SOCK_STREAM, 0);-->m_hSocket = WSASocket(AF_INET, SOCK_STREAM, TPPROTO_TCP, NULL, 0, WSA_FLAG_OVERLAPPED); m_hSocket = socket(AF_INET, SOCK_STREAM, 0);这个socket默认不是OVERLAPPED吗??我看到了以前的帖子http://topic.csdn.net/t/20010620/14/165295.html ret = recv(m_hSocket, ...);//再次接收,测试超时时间此时已经超时出错,getlasterr获得错误此时间间隔相对固定在60s吧。楼主不妨将整个代码段 贴出来,这样才能分析出问题。 本帖最后由 oyljerry 于 2011-06-03 13:30:46 编辑 代码:#ifdef WIN32#include <winsock2.h>#else#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#endif#include <time.h>#include <unistd.h>#include <iostream>using namespace std;#ifdef WIN32#pragma comment(lib, "ws2_32.lib")#endifvoid testTimeout(){ char lsData[2048] = {0}; struct sockaddr_in caddr;#ifdef WIN32 int ltimeout = 30*1000;#else struct timeval ltimeout = {30, 0};#endif int lisocket = socket(AF_INET, SOCK_STREAM, IPPROTO_IP); if(lisocket < 0) return; caddr.sin_family = AF_INET; caddr.sin_port = htons(25); caddr.sin_addr.s_addr = inet_addr("123.125.50.134");//163 smtp server int liret = connect(lisocket, (const sockaddr*)&caddr, sizeof(caddr)); if(liret != 0) return; liret = setsockopt(lisocket, SOL_SOCKET, SO_RCVTIMEO, (const char*)<imeout, sizeof(ltimeout)); liret = recv(lisocket, lsData, sizeof(lsData), 0); cout<<lsData<<endl; int t1 = time(NULL); liret = recv(lisocket, lsData, sizeof(lsData), 0); int t2 = time(NULL); int t3 = t2 - t1; cout<<"t3:"<<t3<<endl; shutdown(lisocket, 0x02); close(lisocket);}int main(){ testTimeout(); return 0;}Ubuntu下结果:root@aa-desktop:/home/aa/Documents# ./testTimeout 220 163.com Anti-spam GT for Coremail System (163com[20101010])t3:30root@aa-desktop: liret = setsockopt(lisocket, SOL_SOCKET, SO_RCVTIMEO, (const char*)<imeout, sizeof(ltimeout)); sizeof(ltimeout))应改为 sizeof(int));两个得数不一样 第二次接收WsaGetlasterror()是10060不? 老问题,求解CImage透明PNG做背景,拖动问题 vc com 派生的虚函数,权限有什么讲究了 jre-6u3-windows-i586-p-s.exe有什么用 散分......需要分的進來領. 请问:自编VC的程序要在没有VC环境的情况下运行,怎样才能加上MFC类库使之成为可执行的EXE文件?? 有关病毒 vc 实现具有删除功能的下拉框 如何在vc编写的程序里面加入音乐,并且程序一启动就播放 ACCESS多表查询的问题 请问在给数据卡升级固件的程序中下载一段时间后就出错是为什么? 我觉得计算器的程序员功能太恐怖了
-->
m_hSocket = WSASocket(AF_INET, SOCK_STREAM, TPPROTO_TCP, NULL, 0, WSA_FLAG_OVERLAPPED);
这个socket默认不是OVERLAPPED吗??我看到了以前的帖子
http://topic.csdn.net/t/20010620/14/165295.html
#ifdef WIN32
#include <winsock2.h>
#else
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#endif#include <time.h>
#include <unistd.h>
#include <iostream>using namespace std;#ifdef WIN32
#pragma comment(lib, "ws2_32.lib")
#endifvoid testTimeout()
{
char lsData[2048] = {0};
struct sockaddr_in caddr;
#ifdef WIN32
int ltimeout = 30*1000;
#else
struct timeval ltimeout = {30, 0};
#endif int lisocket = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
if(lisocket < 0)
return;
caddr.sin_family = AF_INET;
caddr.sin_port = htons(25);
caddr.sin_addr.s_addr = inet_addr("123.125.50.134");//163 smtp server int liret = connect(lisocket, (const sockaddr*)&caddr, sizeof(caddr));
if(liret != 0)
return; liret = setsockopt(lisocket, SOL_SOCKET, SO_RCVTIMEO, (const char*)<imeout, sizeof(ltimeout));
liret = recv(lisocket, lsData, sizeof(lsData), 0);
cout<<lsData<<endl; int t1 = time(NULL);
liret = recv(lisocket, lsData, sizeof(lsData), 0);
int t2 = time(NULL); int t3 = t2 - t1;
cout<<"t3:"<<t3<<endl; shutdown(lisocket, 0x02);
close(lisocket);
}int main()
{
testTimeout(); return 0;
}Ubuntu下结果:
root@aa-desktop:/home/aa/Documents# ./testTimeout
220 163.com Anti-spam GT for Coremail System (163com[20101010])t3:30
root@aa-desktop:
sizeof(ltimeout))应改为 sizeof(int));两个得数不一样