1、select官方函数说明:
语法
C++
int WSAAPI select( [in] int nfds, [in, out] fd_set *readfds, [in, out] fd_set *writefds, [in, out] fd_set *exceptfds, [in] const timeval *timeout );
参数
[in] nfds
已忽略。 包含 nfds 参数只是为了与 Berkeley 套接字兼容。
[in, out] readfds
一个可选指针,指向要检查的一组套接字的可读性。
[in, out] writefds
指向要检查可写性的一组套接字的可选指针。
[in, out] exceptfds
指向要检查错误的一组套接字的可选指针。
[in] timeout
选择等待的最长时间,以 TIMEVAL 结构的形式提供。 将阻止操作的 超时 参数设置为 null 。
返回值
select 函数返回fd_set结构中已就绪并包含的套接字句柄总数;如果时间限制过期,则返回 0;如果发生错误,则返回SOCKET_ERROR。 如果返回值SOCKET_ERROR,则 WSAGetLastError 可用于检索特定的错误代码。
2、阻塞设置
unsigned long cmd = 1;
nRet = ioctlsocket(sclient, FIONBIO, &cmd);
if (SOCKET_ERROR == nRet)
{
printf("Failed to set FIONBIOsocket!\n");
WSACleanup();
return 0;
}
3、设置端口 Reuse属性
bool bReuseAddr = true;
//设置端口SO_REUSEADDR属性,端口释放后可以立即被使用。
nRet = setsockopt(sclient, SOL_SOCKET, SO_REUSEADDR, (char *)&bReuseAddr, sizeof(bReuseAddr));
if (SOCKET_ERROR == nRet)
{
printf("Failed to set resueaddr socket!\n");
WSACleanup();
return 0;
}
什么是resuse属性: