在VC中如何将一个UDP的socket设置成为非阻塞的阿?---Online waiting

reclusewood 2002-12-03 04:56:42
rt
...全文
604 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
cqjiang 2002-12-04
  • 打赏
  • 举报
回复
http://idoor.xiloo.com 《TCP/IP Winsock高级编程》
ysf1980 2002-12-04
  • 打赏
  • 举报
回复
WSAAsyncSelect():要求某一 Socket 有事件 (event) 发生时通知使用者。
格 式: int PASCAL FAR WSAAsyncSelect( SOCKET s, HWND hWnd, unsigned int wMsg, long lEvent );
参 数: s Socket 的编号
hWnd 动作完成後,接受讯息的视窗 handle
wMsg 传回视窗的讯息
lEvent 应用程式有兴趣的网路事件
传回值: 成功 - 0
失败 - SOCKET_ERROR (呼叫 WSAGetLastError() 可得知原因)
WSAAsyncSelect( s, hWnd, 0, 0 ) -- 取消所有 async 事件设定

呼叫 WSAAsyncSelect 的同时也将此一 socket改变成「非阻拦」(non-blocking)模式。但是此时这个 socket 不能很简单地用 ioctlsocket() 这个函式就将它再变回「阻拦」(blocking)模式。也就是说 WSAAsyncSelect 和 ioctlsocket 所改变的「非阻拦」模式仍是有些不同的。如果您想将一个「非同步」(asynchronous)模式的 socket 再变回「阻拦」模式的话,必须
先呼叫 WSAAsyncSelect() 将所有的 async 事件取消,再用 ioctlsocket() 将它变回阻拦模式。

ioctlsocket():控制 Socket 的模式。
格 式: int PASCAL FAR ioctlsocket( SOCKET s, long cmd, u_long FAR *argP );
参 数:s Socket 的识别码
cmd 指令名称
argP 指向 cmd 参数的指标
传回值: 成功 - 0
失败 - SOCKET_ERROR (呼叫 WSAGetLastError() 可得知原因)
说明: 此函式用来获取或设定 Socket 的运作参数。
cmd 的值可为:
FIONBIO -- 开关 non-blocking 模式
FIONREAD -- 自 Socket 一次可读取的资料量(目前 in buffer 的资料量)
SIOCATMARK -- OOB 资料是否已被读取完
reclusewood 2002-12-04
  • 打赏
  • 举报
回复
救命啊~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
sjzxyg 2002-12-04
  • 打赏
  • 举报
回复
0
reclusewood 2002-12-04
  • 打赏
  • 举报
回复
顶哦,高手来提示一下!
shesh 2002-12-04
  • 打赏
  • 举报
回复
我以前做的,好象有setsockopt,这是设置超时的.数据报方式的设置是一样的.
不过告诉你.这设置超时只有winsock2.0才支持

WSADATA data;
sockaddr_in addr;
int ret=0;
int optval = 10000;
char m_put_str[512]="";
char m_Port[6];

memset(m_Port,0,sizeof(m_Port));
strcpy(m_Port,(LPCTSTR) AfxGetApp()->GetProfileString("系统设置","TCP侦听端口","3333"));

memset(&addr,0,sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(atoi(m_Port));

if(WSAStartup(MAKEWORD(2, 2), &data))
{
return FALSE;
}

if (LOBYTE(data.wVersion)!=2||HIBYTE(data.wVersion)!=2)
{
return FALSE;
}

Sck = socket(AF_INET, SOCK_STREAM, 0);
if(Sck==INVALID_SOCKET)
{
return FALSE;
}

ret = bind(Sck, (sockaddr*)&addr, sizeof(addr));
if(ret==SOCKET_ERROR)
{
return FALSE;
}

if(setsockopt(Sck,SOL_SOCKET,SO_SNDTIMEO,
(char * )&optval,sizeof(optval))==SOCKET_ERROR)
{
return FALSE;
}

if(setsockopt(Sck,SOL_SOCKET,SO_RCVTIMEO,
(char * )&optval,sizeof(optval))==SOCKET_ERROR)
{
return FALSE;
}

if(listen(Sck, SOMAXCONN) == SOCKET_ERROR)
{
return FALSE;
}

DWORD m_ThreadId;
m_ThreadHandle = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE) DummyMyThread,
this,CREATE_SUSPENDED|THREAD_TERMINATE,&m_ThreadId);
if(!m_ThreadHandle)
{
return FALSE;
}
ResumeThread(m_ThreadHandle);
return TRUE;
reclusewood 2002-12-03
  • 打赏
  • 举报
回复
WSAAsyncSelect();
setsockopt();
他们中间参数怎么设置阿
ysf1980 2002-12-03
  • 打赏
  • 举报
回复
你用WSAAsyncSelect();
它自动就变为非阻塞模式,除非你用setsockopt()
改变它
reclusewood 2002-12-03
  • 打赏
  • 举报
回复
拜托写详细一点,我也在看msdn,不过没有什么头绪

救命啊~~~~~~~~~~~~~~~~`
reclusewood 2002-12-03
  • 打赏
  • 举报
回复
兄弟哦,详细一些,多谢了,嘿嘿。
zfive 2002-12-03
  • 打赏
  • 举报
回复
setsockopt()

18,356

社区成员

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

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