请问 VC下写的关于socket的程序,server端的超时控制正常,但同样的程序client端就没有起作用,使用setsockopt函数

问题描述

我的server程序:listen:structsockaddr_inr_myaddr;wVersionRequested=MAKEWORD(2,2);rc=WSAStartup(wVersionRequested,&wsdata);/*createsocket*/fd_socket=WSASocket(PF_INET,SOCK_STREAM,0,NULL,0,WSA_FLAG_OVERLAPPED);/*bindsockettomyownIPaddress*/r_myaddr.sin_addr.s_addr=inet_addr(s_localhost_ip);r_myaddr.sin_port=htons(0);r_myaddr.sin_family=AF_INET;bind(fd_socket,(structsockaddr*)&r_myaddr,sizeof(r_myaddr))/*listenatsocketforconnection*/if(listen(fd_socket,LISTEN_BACKLOG)==SOCKET_ERROR){}return(fd_socket);ACCEPT:fd_socket_accept=accept(fd_socket_listening,(structsockaddr*)&r_peeraddr,&i_addrlen);RECV:i_retcd=setsockopt(fd_socket,SOL_SOCKET,SO_RCVTIMEO,(char*)&i_timeout,sizeof(i_timeout));recv(fd_socket,ps_buf,l_len,0);...这样的写法正常,可以处理超时.但其对应的client端就不行了,connect函数:wVersionRequested=MAKEWORD(2,2);rc=WSAStartup(wVersionRequested,&wsdata);r_peeraddr.sin_family=AF_INET;r_peeraddr.sin_addr.s_addr=inet_addr(s_peer_ip);r_peeraddr.sin_port=htons(t_peer_port);/*createsocket*/fd_socket=WSASocket(PF_INET,SOCK_STREAM,0,NULL,0,WSA_FLAG_OVERLAPPED);/*bindsockettomyownIPaddress*/r_myaddr.sin_addr.s_addr=inet_addr(s_localhost_ip);r_myaddr.sin_port=htons(0);r_myaddr.sin_family=AF_INET;bind(fd_socket,(structsockaddr*)&r_myaddr,sizeof(r_myaddr))i_outcome=connect(fd_socket,(structsockaddr*)&r_peeraddr,sizeof(structsockaddr_in));RECV:i_retcd=setsockopt(fd_socket,SOL_SOCKET,SO_RCVTIMEO,(char*)&i_timeout,sizeof(i_timeout));recv(fd_socket,ps_buf,l_len,0);...这时,编译,运行都没有问题,但是超时很严重,根本出不来也就是说,setsockopt(fd_socket,SOL_SOCKET,SO_RCVTIMEO,(char*)&i_timeout,sizeof(i_timeout));对server有效,但对client无效,请高手帮忙看是哪里出问题了,非常感谢!

解决方案

解决方案二:
解决:函数如下:longarch_tcp_recv(SOCKETfd_socket,chars_buf[],longl_msgsize,longl_timeout){char*ps_buf;longl_read_so_far=0L;longl_read=0L;longl_len;longl_alarm_wait=0L;DWORDStart;DWORDEnd;inti_retcd;l_timeout=l_timeout*1000;i_retcd=setsockopt(fd_socket,SOL_SOCKET,SO_RCVTIMEO,(char*)&l_timeout,sizeof(l_timeout));if(i_retcd!=0){/*报错:setsockoptSO_RCVTIMEOfailed*/return(-1);}Start=GetTickCount();while(l_read_so_far<l_msgsize){ps_buf=s_buf+l_read_so_far;l_len=l_msgsize-l_read_so_far;l_read=recv(fd_socket,ps_buf,l_len,0);if(l_read==SOCKET_ERROR){/*报错:recvfromsocket(%d)failed:retcd=%d",fd_socket,l_read*/return(-1);}if(l_read>0){l_read_so_far+=l_read;}if(l_read==0){/*报错:recvfromsocket(%d)failed:theconnectionhasbeengracefullyclosed.",fd_socket*/return(-1);}End=GetTickCount();if(End-Start>(DWORD)l_timeout){/*报错:timeout(%d):elapse(%d)",l_timeout,End-Start*/return(-1);}}return(l_read_so_far);}/*arch_tcp_recv*/

时间: 2024-10-06 03:24:21

请问 VC下写的关于socket的程序,server端的超时控制正常,但同样的程序client端就没有起作用,使用setsockopt函数的相关文章

c#-求助,请问,E写的DLL被C#调用就报错是为什么?

问题描述 求助,请问,E写的DLL被C#调用就报错是为什么? 求助,请问,E写的DLL被C#调用就报错是为什么? 传参弹窗的那种DLL 解决方案 贴出你的函数原型,看看C#这里声明的对不对. 解决方案二:

文件传输-关于Socket通信问题 ,Sever和Client端如何相互判断对方中断以及终断

问题描述 关于Socket通信问题 ,Sever和Client端如何相互判断对方中断以及终断 一个手机做为Server端,其他多个手机做为Client端,用Socket建立连接,然后进行文件传输,怎么判断Server和Client端的中断以及终断? 解决方案 百度查查Soket心跳检测怎样做.http://blog.sina.com.cn/s/blog_a459dcf5010153m5.html 解决方案二: 初学者,没怎么看懂,谢谢!! 解决方案三: 数据小的消息相互发送与应答(降低流量),定

mfc-我用VC在HKEY_LOCAL_MACHINE下写注册表不成功,而在其他如HKEY_CURRENT_USER却行

问题描述 我用VC在HKEY_LOCAL_MACHINE下写注册表不成功,而在其他如HKEY_CURRENT_USER却行 我用的是win8.1系统,我提升了进程权限也没有反应,不知道是不是方法不对 解决方案 GetLastError 看看返回值,

请问各位高手extpwd工程在VC下怎么才能编译成功啊?谢谢啦!

问题描述 请问各位高手extpwd工程在VC下怎么才能编译成功啊?谢谢啦! 解决方案 解决方案二:发错地方了吧,兄弟解决方案三:extpwd是LotusNotesc/c++API提供的sample例程,提供了automake脚步,可以直接调用编译器编译.如果需要在VC环境下通过编译,最好新建一个工程.

link下先任取3个数组,再任取一个数据,请问代码怎么写?怎么没有人会?

问题描述 link下先任取3个数组,再任取一个数据,请问代码怎么写?怎么没有人会? link下先任取3个数组,再任取一个数据,请问代码怎么写?怎么没有人会? 解决方案 int[][] arrs = new int[][] { new int[] {1,2,3}, new int[] {4,5,6}, new int[] {7,8,9}, new int[] {10,11,12}}; var query = arrs.OrderBy(x => Guid.NewGuid()).Take(3).Sel

socket-在Linux下写好的更新程序,怎么在visual studio里面运行啊

问题描述 在Linux下写好的更新程序,怎么在visual studio里面运行啊 如题,本人以前长在linux下编程,现在写好了更新的程序,但是有用到socket,在弄到studio2010里的时候报错说找不到各种支持socket的头文件例如socket.h unistd.h,由于第一次使用这个软件不懂啊,请大神指点,对了,我是新建项目选的win32控制台,然后选空项目,再添加.c .h文件,结果运行报错找不到头文件,但是我写的hello word能运行啊,好费解求救 解决方案 visual

请问VC++ 怎样处理DPI才能使界面不发虚?

问题描述 请问VC++ 怎样处理DPI才能使界面不发虚? VisualStudio 2015 界面引擎 Sciter 生成的程序界面发虚,怎样处理? 左侧的模糊 右侧的为添加dpi-aware.manifest后的效果 解决方案 贴出图看下是怎么个虚?应该和dpi无关,而是和你绘制字体的反锯齿选项有关.

我写的socket监听过一段时间就需要重新启动一下程序是什么原因

问题描述 我写的socket监听过一段时间就需要重新启动一下程序是什么原因 private void StartReceive() { string msg = null; IPEndPoint iep = new IPEndPoint(IPAddress.Parse(PublicVariables.BJIP), PublicVariables.PORT); socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, Pr

解决方案-请问,自己写的android项目在一些三星华为手机不能运行。

问题描述 请问,自己写的android项目在一些三星华为手机不能运行. 这是个什么样的问题,百度谷歌都没找到相关的解决方案,如何解决 解决方案 要看具体的错误信息呀 不能运行的情况太多了 解决方案二: 挂上eclipse,调试状态下看看报错信息是什么 解决方案三: 我也遇到过,Google原生系统没问题,三星上各种bug各种崩溃 解决方案四: 我也遇到过,Google原生系统没问题,三星上各种bug各种崩溃 解决方案五: 在三星华为的手机上运行,问题确实比在其它手机上运行的问题多,也遇到过好多次