首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

VC 在DLL中用SOCKET,设置了RECV时限,却无效,该如何解决

2014-06-09 
VC 在DLL中用SOCKET,设置了RECV时限,却无效VC 在DLL中用SOCKET,设置了RECV时限,却无效,请高手指点一下1:Co

VC 在DLL中用SOCKET,设置了RECV时限,却无效
VC 在DLL中用SOCKET,设置了RECV时限,却无效,请高手指点一下
1:Connect_Server为连接函数


SOCKET CsfgsetdataApp::Connect_Server(char* &return_char,char* conip)
{
CString css;
SOCKET s=INVALID_SOCKET;
WORD wVersionRequested;
WSADATA wsa;
BOOL bDontLinger = FALSE; 
int iBufLen = 0;
DWORD dwNo = 0;
wVersionRequested = MAKEWORD( 2, 2 );
int res = WSAStartup(wVersionRequested,&wsa);
if(res == -1)
{
css="0:1001";
return_char=css.GetBuffer(css.GetLength());
return s;
}

struct sockaddr_in socket_in;
s =  WSASocket(AF_INET,SOCK_STREAM,0,NULL,0,0);
if(s == INVALID_SOCKET)
{
css="0:1002";
return_char=css.GetBuffer(css.GetLength());
return s;
}

int iOptVal = 1;
struct linger linger = { 0 };
linger.l_onoff = 1;
linger.l_linger = 30;
    if( setsockopt(s,SOL_SOCKET, SO_REUSEADDR,(char*)&linger, sizeof(linger)) == -1 )
    { 
closesocket(s);
WSACleanup();
return s;
}

////////////////////////////////////////////////
socket_in.sin_family = AF_INET;
socket_in.sin_port = htons(5000);
socket_in.sin_addr.S_un.S_addr = inet_addr(conip);//

int con_res = connect(s,(struct sockaddr*)&socket_in,sizeof(socket_in));
if(con_res == SOCKET_ERROR)
{
//失败
css.Format("0:1003:%s",conip);
return_char=css.GetBuffer(css.GetLength());
closesocket(s);
WSACleanup();
return s;
}
else
{
///设置接收时限
int nNetTimeout=10000;
setsockopt(s,SOL_SOCKET, SO_RCVTIMEO,(char *)&nNetTimeout,sizeof(int));             
//关闭套接字上的发送缓冲,这样可以提高性能
setsockopt(s,SOL_SOCKET,SO_SNDBUF,(const char*)&iBufLen,sizeof(int));
setsockopt(s,SOL_SOCKET,SO_RCVBUF,(const char*)&iBufLen,sizeof(int));           
//强制发送延时算法关闭,直接发送到网络上去
setsockopt(s,IPPROTO_TCP,TCP_NODELAY,(char*)&dwNo,sizeof(DWORD));
//如果要已经处于连接状态的soket在调用closesocket后强制关闭,不经历
setsockopt(s,SOL_SOCKET,SO_DONTLINGER,(const char*)&bDontLinger,sizeof(BOOL));
//closesocket(一般不会立即关闭而经历TIME_WAIT的过程)后想继续重用该socket:
bDontLinger=TRUE;
setsockopt(s,SOL_SOCKET ,SO_REUSEADDR,(char*)&bDontLinger,sizeof(BOOL));
linger.l_onoff = 1;
linger.l_linger = 0;
setsockopt(s,SOL_SOCKET,SO_LINGER,(const char*)&linger,sizeof(linger));
return_char="0000";
return s;
}
}


2:

extern "C"  __declspec(dllexport)  char* WINAPI __stdcall  
sfaddgys(char* youno,char* lseverid)
{
SOCKET sct;
int li_sendcut;
char* retrun_cr;
CString retruncst;
        char sendbuff[1024]={0};
char recbuff[2048]={'\0'};
sct=wapp->Connect_Server(retrun_cr,icserips);
if (!strcmp(retrun_cr,"0000"))
{
li_sendcut=::send(sct,sendbuff, sizeof(sendbuff),0);
if(li_sendcut>0)
{
int nRecv = ::recv(sct, recbuff, sizeof(recbuff), 0);
if (nRecv<=0)
{
.........................................................


我用:
int nNetTimeout=10000;
setsockopt(s,SOL_SOCKET, SO_RCVTIMEO,(char *)&nNetTimeout,sizeof(int)); 
设置了接收时限,为什么会无效了,我应该怎么做,才能解决这个问题 
[解决办法]
你看设置成功了没,不是有返回值吗?
确认一下就getsockopt看看,看你设置的对不对?

热点排行