ioctlsocket这个函数在Select模型中是必须的吗?我用的是Select模型,UDP,2个socket 测试。多谢!!

toyjoy 2004-09-09 09:46:52
《windows网络编程》第一版的程序里关于Select模型的例子里有这个函数
而第二版里nonblocking的例子,也就是select模型,没有此函数

我的程序里,定义了2个UDP socket绑定在同一IP,2个端口上。
如果不用这个ioctlsocket设置socket的话,那么select不能正常运行,程序总是停在select这里。
但是只要用ioctlsocket设置一个socket的话,就可以正常运行了。

那么ioctlsocket这个函数在Select模型中是必须的吗?

非常感谢!!
...全文
462 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
wang_bluebird 2005-03-30
  • 打赏
  • 举报
回复
mark
msdn_user 2004-09-09
  • 打赏
  • 举报
回复
select会自动把套节字置为非阻塞模式
toyjoy 2004-09-09
  • 打赏
  • 举报
回复
不过我不改成该模式也可以正常运行


bbcharm 2004-09-09
  • 打赏
  • 举报
回复
(ioctlsocket(s, FIONBIO, &nonBlock) 这句话的意思是把S 改成非阻塞模式
如果不使用ioctlsocket sock 默认为阻塞模式
在使用SELECT的时候要改成 非阻塞模式
toyjoy 2004-09-09
  • 打赏
  • 举报
回复


#include "stdafx.h"
#include "winsock2.h"

#define LOCALIP "192.168.3.96"
#define LOCALPORT 8201
#define LOCALPORT1 8101

#define REMOTEIP "192.168.3.96"
#define REMOTEPORT 8787
#define BUFSIZE 1024

int main(int argc, char* argv[])
{
SOCKET s, s1;
int Ret;
WSADATA wsaData;
SOCKADDR_IN localAddr, remoteAddr, localAddr1;
int localAddrLen, remoteAddrLen, localAddrLen1;
fd_set fdRead;
fd_set fdWright;
fd_set fdExcept;
int retSelect;
char buf[BUFSIZE];

if ((Ret = WSAStartup(0x0202,&wsaData)) != 0)
{
printf("WSAStartup() failed with error %d\n", Ret);
WSACleanup();
return 1;
}

// if ((s = WSASocket(AF_INET, SOCK_DGRAM, IPPROTO_IP, NULL, 0,
// WSA_FLAG_OVERLAPPED)) == INVALID_SOCKET)

if ((s = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP)) == INVALID_SOCKET)
{
printf("create socket error\n");
return 1;
}

localAddr.sin_addr.s_addr = inet_addr(LOCALIP);
localAddr.sin_family = AF_INET;
localAddr.sin_port = htons(LOCALPORT);
localAddrLen = sizeof(SOCKADDR_IN);

if (bind(s, (SOCKADDR *)&localAddr, localAddrLen) == SOCKET_ERROR)
{
printf("bind error\n");
return 1;
}

if ((s1 = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP)) == INVALID_SOCKET)
{
printf("create socket error\n");
return 1;
}
localAddr1.sin_addr.s_addr = inet_addr(LOCALIP);
localAddr1.sin_family = AF_INET;
localAddr1.sin_port = htons(LOCALPORT1);
localAddrLen1 = sizeof(SOCKADDR_IN);

if (bind(s1, (SOCKADDR *)&localAddr1, localAddrLen1) == SOCKET_ERROR)
{
printf("bind error\n");
return 1;
}

ULONG nonBlock = 1;
// if (ioctlsocket(s, FIONBIO, &nonBlock) == SOCKET_ERROR)
// {
// printf("ioctlsocket error\n");
// return 1;
// }
// if (ioctlsocket(s1, FIONBIO, &nonBlock) == SOCKET_ERROR)
// {
// printf("ioctlsocket error\n");
// return 1;
// }

while (1)
{
FD_ZERO(&fdRead);
FD_ZERO(&fdWright);
FD_ZERO(&fdExcept);
FD_SET(s, &fdRead);
FD_SET(s1, &fdRead);

printf("selecting¡­¡­\n");
if (retSelect = select(s + 1, &fdRead, &fdWright, &fdExcept, NULL))
{
if (retSelect == SOCKET_ERROR)
{
printf("select error\n");
return 1;
}

if (FD_ISSET(s, &fdRead))
{
remoteAddrLen = sizeof(SOCKADDR_IN);
int nret;
if ((nret = recvfrom(s, buf, BUFSIZE, 0, (SOCKADDR *)&remoteAddr,
&remoteAddrLen)) == SOCKET_ERROR)
{
printf("recvfrom error\n");
break;
}
else
{
buf[nret] = '\0';
printf("[%s] send msg: %s\n",
inet_ntoa(remoteAddr.sin_addr), buf);
}
}
if (FD_ISSET(s1, &fdRead))
{
remoteAddrLen = sizeof(SOCKADDR_IN);
int nret;
if ((nret = recvfrom(s1, buf, BUFSIZE, 0, (SOCKADDR *)&remoteAddr,
&remoteAddrLen)) == SOCKET_ERROR)
{
printf("recvfrom1 error\n");
break;
}
else
{
buf[nret] = '\0';
printf("[%s] send msg1: %s\n",
inet_ntoa(remoteAddr.sin_addr), buf);
}
}
if (FD_ISSET(s, &fdWright))
{
printf("fdWright\n");
}
if (FD_ISSET(s, &fdExcept))
{
printf("fdExcept\n");
}

}
}


return 0;
}

18,363

社区成员

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

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