怎样取得socket的I/O模式(阻塞,非阻塞)?

bbq1980 2004-06-25 01:00:18
怎样取得socket的I/O模式(阻塞,非阻塞)?
...全文
255 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
bbq1980 2004-07-23
  • 打赏
  • 举报
回复
唉,没办法总要结帖的嘛~~~
PiggyXP 2004-07-09
  • 打赏
  • 举报
回复
哦,想要知道是否设置成功看一下返回值就OK了

//设置非阻塞方式连接
unsigned long ul = 1;
ret = ioctlsocket(cClient, FIONBIO, (unsigned long*)&ul);
if(ret==SOCKET_ERROR) // error
oyangfeng 2004-07-09
  • 打赏
  • 举报
回复
我也想知道这个问题的答案,我也想知道设置socket的模式后是否真的成功
PiggyXP 2004-07-06
  • 打赏
  • 举报
回复
噢呵呵,就是看把它设置为非阻塞模式是否成功啊呵呵^_^
bbq1980 2004-06-30
  • 打赏
  • 举报
回复
needways(needways) 你的这种做法是错误的
ffantasyYD(风之子) 呵呵...哥们儿谢谢你,谢谢你的热心
ffantasyYD 2004-06-28
  • 打赏
  • 举报
回复
就前几天有个朋友也问过一个同样的问题,以下是我的回答,这种方法虽然不是很好,但的确可以判断:

可以这样判断:因为设置为非阻塞模式的socket在调用一些阻塞函数(如recv)的时候要返回错误,错误号为10035,所以可以利用这一点来判断。如果调用这些阻塞函数的时候返回错误,且错误号为10035,那么就说明这个socket是非阻塞;否则为阻塞。代码如下:
#include "stdafx.h"
#include "winsock2.h"
#include "stdio.h"
#pragma comment (lib,"ws2_32.lib")

int main(int argc, char* argv[])
{
SOCKET sock;
WSADATA WSAData;
sockaddr_in from,addr;
int len=sizeof(sockaddr_in);
char buf[512]={0};

if(WSAStartup(MAKEWORD(2,2), &WSAData)!=0)
{
printf("WSAStartup error!\n");
return -1;
}

if((sock=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP))==INVALID_SOCKET)
{
printf("socket error!\n");
return -1;
}

ULONG arg=1;
ioctlsocket(sock,FIONBIO,&arg); //注掉这里就不会有错,否则错误号10035

addr.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addr.sin_port=htons(5121);
addr.sin_family=AF_INET;

bind(sock,(sockaddr *)&addr,sizeof(sockaddr));
if(recvfrom(sock,buf,512,0,(sockaddr *)&from,&len)==SOCKET_ERROR)
{
printf("recvfrom error : %d\n",::WSAGetLastError()); //显示错误号
return -1;
}

return 0;
}
nkwesley 2004-06-27
  • 打赏
  • 举报
回复
getsockopt
The getsockopt function retrieves a socket option.

int getsockopt(
SOCKET s,
int level,
int optname,
char FAR *optval,
int FAR *optlen
);
Parameters
s
[in] Descriptor identifying a socket.
level
[in] Level at which the option is defined; the supported levels include SOL_SOCKET and IPPROTO_TCP. See Windows Sockets 2 Protocol-Specific Annex for more information on protocol-specific levels.
optname
[in] Socket option for which the value is to be retrieved.
optval
[out] Pointer to the buffer in which the value for the requested option is to be returned.
optlen
[in, out] Pointer to the size of the optval buffer.
needways 2004-06-27
  • 打赏
  • 举报
回复
DWORD dwNoBlock = 0;
if ((SOCKET_ERROR == ioctlsocket(sock, FIONBIO, &dwNoBlock)) &&
(WSAEINVAL == WSAGetLastError())) {
// 非阻塞模式
} else {
// 阻塞模式
}
PiggyXP 2004-06-27
  • 打赏
  • 举报
回复
这个还真是不知道

getsockopt的SO_TYPE只能判断它是流式的还是数据报式的,得不到它是否是阻塞的啊-_-b
自由的风 2004-06-26
  • 打赏
  • 举报
回复
以下截取自MSDN:

int getsockopt(
SOCKET s,
int level,
int optname,
char FAR *optval,
int FAR *optlen
);

SO_TYPE int The type of the socket (for example, SOCK_STREAM).
bbq1980 2004-06-25
  • 打赏
  • 举报
回复
我是说怎么取得?
zhhao 2004-06-25
  • 打赏
  • 举报
回复
ioctlsocket(soctket s,long cmd,u_long Far* arpP)
MFCClass 2004-06-25
  • 打赏
  • 举报
回复
ioctlsocket

18,356

社区成员

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

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