VC 在DLL中用SOCKET,设置了RECV时限,却无效

wxliangzyt 2013-12-12 05:26:09
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));
设置了接收时限,为什么会无效了,我应该怎么做,才能解决这个问题
...全文
198 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
testbaowan2000 2014-04-29
  • 打赏
  • 举报
回复
if( setsockopt(s,SOL_SOCKET, SO_REUSEADDR,(char*)&linger, sizeof(linger)) == -1 ) 改为if( setsockopt(s,SOL_SOCKET, SO_LINGER,(char*)&linger, sizeof(linger)) == -1 )
wxliangzyt 2013-12-15
  • 打赏
  • 举报
回复
我顶顶我顶顶我顶顶我顶顶我顶顶我顶顶我顶顶我顶顶
wxliangzyt 2013-12-13
  • 打赏
  • 举报
回复
我顶顶我顶顶我顶顶我顶顶我顶顶我顶顶我顶顶我顶顶
版主大哥 2013-12-12
  • 打赏
  • 举报
回复
你看设置成功了没,不是有返回值吗? 确认一下就getsockopt看看,看你设置的对不对?

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧