游戏开发论坛

 找回密码
 立即注册
搜索
查看: 5317|回复: 6

··关于设置Socket为非阻塞,请高手指教~~!

[复制链接]

58

主题

281

帖子

281

积分

中级会员

Rank: 3Rank: 3

积分
281
QQ
发表于 2003-8-6 23:36:00 | 显示全部楼层 |阅读模式

WSAAsyncSelect( ServerSock, NULL, NETWORK_EVENT, FD_ACCEPT | FD_CLOSE | FD_READ | FD_WRITE );
只要在初始化的时候执行这个函数就可以了吗?

非阻塞这一概念,是不是单指accept()和recv()函数的性质?
收不到就立即返回而不等待?如果真是这样,那么它们会返回什么值呢?
还有,我想要accept()阻塞,而recv()非阻塞,可以实现吗?

————————————
我刚学winsock才几天,有很多地方都不明白,但又找不到相关的书籍,只好来这里问了,望高手们能不吝赐教~~ 谢谢!

58

主题

281

帖子

281

积分

中级会员

Rank: 3Rank: 3

积分
281
QQ
发表于 2003-8-7 03:46:00 | 显示全部楼层

Re:··关于设置Socket为非阻塞,请高手指教~~!

WSADATA                        wsaData;
        sockaddr_in                SockAddr;

        // 初始化TCP协议
        if( WSAStartup( 0x0101, &wsaData ) )
                return FALSE;

        // 创建服务器端套接字
        if( ( ServerSock = socket(PF_INET,SOCK_STREAM,0) ) == INVALID_SOCKET )
        {
                MessageBox( NULL, "创建Socket失败!", "", MB_OK );
                return FALSE;
        }

        // 绑定到本地一个端口上
        SockAddr.sin_family = AF_INET;
        SockAddr.sin_port = htons(port);
        SockAddr.sin_addr.S_un.S_addr = INADDR_ANY;

        if( bind( ServerSock, (struct sockaddr *)&SockAddr, sizeof(SockAddr) ) == SOCKET_ERROR )
        {
                MessageBox( NULL, "绑定端口失败!", "", MB_OK );
        return FALSE;
        }

        // 将SeverSock设置为异步非阻塞模式,并为它注册各种网络异步事件
        if( WSAAsyncSelect( ServerSock, NULL, NETWORK_EVENT, FD_ACCEPT | FD_CLOSE | FD_READ | FD_WRITE ) == SOCKET_ERROR )
    {
        MessageBox( NULL, "注册网络异步事件失败!", "", MB_OK );
        return FALSE;
    }

以上有错吗?运行到WSAAsyncSelect()时总是返回SOCKET_ERROR,何解?

58

主题

281

帖子

281

积分

中级会员

Rank: 3Rank: 3

积分
281
QQ
发表于 2003-8-7 04:43:00 | 显示全部楼层

Re:··关于设置Socket为非阻塞,请高手指教~~!


刚刚听说,用 ioctlsocket(socket, FIONBIO, (unsigned long*)&length);就可以了?参数FIONBIO,作用是?
是不是用它可以检测出是否收到信息,若有则调用recv(),没有则不调用。
不用调用WSAAsyncSelect()也可以了。
嗯,希望是吧~~总之我去测试一下了~~(自言自语)。

58

主题

281

帖子

281

积分

中级会员

Rank: 3Rank: 3

积分
281
QQ
发表于 2003-8-7 04:48:00 | 显示全部楼层

Re:··关于设置Socket为非阻塞,请高手指教~~!


val = 1;
ioctlsocket( 1, FIONBIO, &val); /* ?更 socket 1 特性? Non-Blocking */
n = recv( 1, data, 50 );        /* ?取?料 */
if ( n > 0 )    /* ?取到?料 */
   memcpy( buf, data, n );
else    /*?]有?取到?料 */

6

主题

40

帖子

58

积分

注册会员

Rank: 2

积分
58
发表于 2003-8-8 00:47:00 | 显示全部楼层

Re: ··关于设置Socket为非阻塞,请高手指教~~!

你的参数 NETWORK_EVENT 是什么???

关于非阻塞设置,就是通过ioctlsocket函数完成

58

主题

281

帖子

281

积分

中级会员

Rank: 3Rank: 3

积分
281
QQ
发表于 2003-8-8 08:56:00 | 显示全部楼层

Re:··关于设置Socket为非阻塞,请高手指教~~!


#define        NETWORK_EVENT        (WM_USER+1)

6

主题

40

帖子

58

积分

注册会员

Rank: 2

积分
58
发表于 2003-8-9 16:49:00 | 显示全部楼层

Re: Re: ··关于设置Socket为非阻塞,请高手指教~~!

汗一个,

WSAAsyncSelect的第二个参数是一个句柄

如果你传递给它的是窗口句柄,那么网络消息会发送到你的窗口消息函数里面去的。

如果你传递是一个Event的句柄,那么Socket会触发Event

你通过响应Event,就可以处理网络事件了!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2024-4-20 04:40

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表