winsock 超时设置问题

qjzrd 2006-09-09 11:59:16
我在写服务端
SOCKET client_form;
int acceptvalue,size_newaddr;
size_newaddr=sizeof(sockaddr_in);
while(rev_over)
{
acceptvalue=accept(server_sock,(struct sockaddr*)&client_addr,&size_newaddr);
rev_over1=true;
while(rev_over1)
{
f_value=recv(acceptvalue,p_revstr,1024,0);
if (f_value == 0)//0表示关闭
{
rev_over=false;
rev_over1=false;
closesocket(acceptvalue);
}

}

closesocket(server_sock);
}
由于等了很久没有人来连接我就想关闭
就是想加个超时功能 比如等两分钟没有连接就关闭
怎么写 谢谢
...全文
519 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
qjzrd 2006-09-09
  • 打赏
  • 举报
回复
我知道用select 但是我不会应用这个函数
你能帮我写出来么 非常的感谢
Arthur_ 2006-09-09
  • 打赏
  • 举报
回复
select()
最后一个参数设置超时间
qjzrd 2006-09-09
  • 打赏
  • 举报
回复
#include <string.h>
#include <stdio.h>
#include <time.h>
#include <winsock.h>
#pragma comment(lib,"WSOCK32.lib")

//===========
//函数声明


char *server_recvstr()
{
char p_revstr[1024]={0};
WSADATA wsadata;
DWORD wversion;
int server_sock;
struct sockaddr_in server_addr,client_addr;
int f_value;
bool rev_over=true,rev_over1=true;

wversion=MAKEWORD(2,2);
WSAStartup(wversion,&wsadata);//winsock版本号
server_sock=socket(AF_INET,SOCK_STREAM,0);//创建socket套接字

server_addr.sin_family=AF_INET;
server_addr.sin_addr.S_un.S_addr =inet_addr("192.168.0.99");//金牛服务器地址15.15.16.130
server_addr.sin_port =htons(7991);//服务端口

bind(server_sock,(struct sockaddr*)&server_addr,sizeof(server_addr));
listen(server_sock,10);

SOCKET client_form;
int acceptvalue,size_newaddr;
size_newaddr=sizeof(sockaddr_in);

printf("kaishi\n");
ULONG nonBlock = 1;
ioctlsocket(server_sock, FIONBIO, &nonBlock);//设置为非组塞模式
while(rev_over)
{
acceptvalue=accept(server_sock,(struct sockaddr*)&client_addr,&size_newaddr);

int nSelectRet;
int nErrorCode;
struct timeval tv;
tv.tv_sec=120;
tv.tv_usec=120;
fd_set sk_fd;
FD_ZERO(&sk_fd);
FD_SET (server_sock,&sk_fd);
nSelectRet = select(server_sock+1,&sk_fd,NULL,NULL,&tv);

if(SOCKET_ERROR==nSelectRet)
{
nErrorCode=WSAGetLastError();
printf("select read status errorcode=%d",nErrorCode);
closesocket(server_sock);
//重新连接(客户方),或服务线程退出(服务方);
rev_over=false;
}

if(nSelectRet==0)//超时发生,无可读数据
{
printf("11111\n");

//继续查读状态或向对方主动发送

}
else
{
printf("33333\n");
//读数据

}
}
return p_revstr;
}
这样对了 呵呵
非常非常的感谢你
qjzrd 2006-09-09
  • 打赏
  • 举报
回复
#include <string.h>
#include <stdio.h>
#include <time.h>
#include <winsock.h>
#pragma comment(lib,"WSOCK32.lib")

//===========
//函数声明


char *server_recvstr()
{
char p_revstr[1024]={0};
WSADATA wsadata;
DWORD wversion;
int server_sock;
struct sockaddr_in server_addr,client_addr;
int f_value;
bool rev_over=true,rev_over1=true;

wversion=MAKEWORD(2,2);
WSAStartup(wversion,&wsadata);//winsock版本号
server_sock=socket(AF_INET,SOCK_STREAM,0);//创建socket套接字

server_addr.sin_family=AF_INET;
server_addr.sin_addr.S_un.S_addr =inet_addr("192.168.0.99");//金牛服务器地址15.15.16.130
server_addr.sin_port =htons(7991);//服务端口

bind(server_sock,(struct sockaddr*)&server_addr,sizeof(server_addr));
listen(server_sock,10);

SOCKET client_form;
int acceptvalue,size_newaddr;
size_newaddr=sizeof(sockaddr_in);

printf("kaishi\n");
ULONG nonBlock = 1;
ioctlsocket(server_sock, FIONBIO, &nonBlock);//设置为非组塞模式

acceptvalue=accept(server_sock,(struct sockaddr*)&client_addr,&size_newaddr);

int nSelectRet;
int nErrorCode;
struct timeval tv;
tv.tv_sec=120;
tv.tv_usec=120;
fd_set sk_fd;
FD_ZERO(&sk_fd);
FD_SET (acceptvalue,&sk_fd);
nSelectRet = select(server_sock+1,&sk_fd,NULL,NULL,&tv);

if(SOCKET_ERROR==nSelectRet)
{
nErrorCode=WSAGetLastError();
printf("select read status errorcode=%d",nErrorCode);
closesocket(server_sock);
//重新连接(客户方),或服务线程退出(服务方);
}

if(nSelectRet==0)//超时发生,无可读数据
{
printf("11111\n");

//继续查读状态或向对方主动发送

}
else
{
printf("33333\n");
//读数据

}

return p_revstr;
}
我这样的 还是不行 帮我看看哪里错了
Arthur_ 2006-09-09
  • 打赏
  • 举报
回复
en
qjzrd 2006-09-09
  • 打赏
  • 举报
回复
你的这代码放在
printf("kaishi\n");
acceptvalue=accept(server_sock,(struct sockaddr*)&client_addr,&size_newaddr);
它的后面么
我的是默认的阻塞的哦
是不是要改成非阻塞的呢
Arthur_ 2006-09-09
  • 打赏
  • 举报
回复
struct timeval tv;
tv.sec=2;
tv.usec=2000;
fd_set sk_fd;
FD_ZERO(&sk_fd);
FD_SET (acceptvalue,&sk_fd);
select(acceptvalue+1,&sk_fd,NULL,NULL,&tv);

if(FD_ISSET(&sk_fd,acceptvalue)){ }


参考一下select


qjzrd 2006-09-09
  • 打赏
  • 举报
回复
我的代码这样:
但是不对
char *server_recvstr()
{
char p_revstr[1024]={0};
WSADATA wsadata;
DWORD wversion;
int server_sock;
struct sockaddr_in server_addr,client_addr;
int f_value;
bool rev_over=true,rev_over1=true;

wversion=MAKEWORD(2,2);
WSAStartup(wversion,&wsadata);//winsock版本号
server_sock=socket(AF_INET,SOCK_STREAM,0);//创建socket套接字

server_addr.sin_family=AF_INET;
server_addr.sin_addr.S_un.S_addr =inet_addr("192.168.0.99");//金牛服务器地址15.15.16.130
server_addr.sin_port =htons(7991);//服务端口

bind(server_sock,(struct sockaddr*)&server_addr,sizeof(server_addr));
listen(server_sock,10);

SOCKET client_form;
int acceptvalue,size_newaddr;
size_newaddr=sizeof(sockaddr_in);

TIMEVAL tv01 = {0, 10};//1ms钟延迟,实际为0-10毫秒
int nSelectRet;
int nErrorCode;
FD_SET fdr = {1, server_sock};
nSelectRet= select(0, &fdr,NULL,NULL,&tv01);
printf("kaishi\n");
acceptvalue=accept(server_sock,(struct sockaddr*)&client_addr,&size_newaddr);
nSelectRet= select(0, &fdr,NULL,NULL,&tv01);
if(SOCKET_ERROR==nSelectRet)
{
nErrorCode=WSAGetLastError();
printf("select read status errorcode=%d",nErrorCode);
closesocket(server_sock);
//重新连接(客户方),或服务线程退出(服务方);
}
if(nSelectRet==0)//超时发生,无可读数据
{
printf("11111\n");

//继续查读状态或向对方主动发送

}
else
{
printf("33333\n");
//读数据

}
closesocket(server_sock);

return p_revstr;
}
帮我纠正一下

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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