请教:
int WSAInit()
{
WORD wVersionRequest;
WSADATA wsData;
int err;
wVersionRequest = MAKEWORD(2,2);
err = WSAStartup(wVersionRequest, &wsData);
return 0;
}int main()
{
if(WSAInit())//加载套接字库
{
cout << "加载套接字库失败" << endl;
return -1;
} SOCKET sockSrv = socket(AF_INET, SOCK_STREAM, 0);//创建用于监听的套接字
SOCKADDR_IN addrSrv;
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(8888);
addrSrv.sin_addr.S_un.S_addr = INADDR_ANY; //绑定
if(bind(sockSrv, (const SOCKADDR*)&addrSrv, sizeof(SOCKADDR)) == SOCKET_ERROR)
{
cout << "绑定失败" << endl;
return -1;
} listen(sockSrv, 5);
cout << "开始监听..." << endl; fd_set fdSocket;
FD_ZERO(&fdSocket); //清空集合中所有的元素
FD_SET(sockSrv, &fdSocket); //将 sockSrv 加入 fdSocket 集合 while(TRUE)
{
fd_set fdRead = fdSocket;
int nRet = select(0, &fdRead, NULL, NULL, NULL);
if(nRet > 0)
{
for(int i=0; i<(int)fdSocket.fd_count; ++i)
{
if(FD_ISSET(fdSocket.fd_array[i], &fdRead))
{
if(fdSocket.fd_array[i] == sockSrv)
{
if(fdSocket.fd_count < FD_SETSIZE)
{
SOCKADDR_IN addrClient;
int len = sizeof(SOCKADDR); SOCKET sockClient = accept(sockSrv, (SOCKADDR*)&addrClient, &len);
FD_SET(sockClient, &fdSocket); //加入到 fdSocket
cout << "收到连接:" << inet_ntoa(addrClient.sin_addr) << "[" << fdSocket.fd_count - 1 << "]" << endl; }
else
{
cout << "连接过多" << endl;
continue;
}
}
else
{
char strRecv[256];
int nRecv = recv(fdSocket.fd_array[i], strRecv, 256, 0);
if(nRecv > 0)
{
strRecv[nRecv] = '\0';
cout << "收到数据:" << strRecv << endl;
}
else
{
closesocket(fdSocket.fd_array[i]);
FD_CLR(fdSocket.fd_array[i], &fdSocket);
}
}
}
}
}
else
{
cout << "select 失败" << endl;
break;
}
} return 0;
}
请教:
1:
if(FD_ISSET(fdSocket.fd_array[i], &fdRead))
这句话的作用是什么?
和 fdRead 比较 有什么意义?2:
if(fdSocket.fd_array[i] == sockSrv)
这句话是什么意思?
为什么是 if(fdSocket.fd_array[i] == sockSrv)
{
//为什么是执行这里
SOCKADDR_IN addrClient; //客户端地址
int len = sizeof(SOCKADDR); //长度 SOCKET sockClient = accept(sockSrv, (SOCKADDR*)&addrClient, &len);
FD_SET(sockClient, &fdSocket); //加入到 fdSocket
}
else
{
//为什么是这行这里
char strRecv[256];
int nRecv = recv(fdSocket.fd_array[i], strRecv, 256, 0);
}谢谢!
int WSAInit()
{
WORD wVersionRequest;
WSADATA wsData;
int err;
wVersionRequest = MAKEWORD(2,2);
err = WSAStartup(wVersionRequest, &wsData);
return 0;
}int main()
{
if(WSAInit())//加载套接字库
{
cout << "加载套接字库失败" << endl;
return -1;
} SOCKET sockSrv = socket(AF_INET, SOCK_STREAM, 0);//创建用于监听的套接字
SOCKADDR_IN addrSrv;
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(8888);
addrSrv.sin_addr.S_un.S_addr = INADDR_ANY; //绑定
if(bind(sockSrv, (const SOCKADDR*)&addrSrv, sizeof(SOCKADDR)) == SOCKET_ERROR)
{
cout << "绑定失败" << endl;
return -1;
} listen(sockSrv, 5);
cout << "开始监听..." << endl; fd_set fdSocket;
FD_ZERO(&fdSocket); //清空集合中所有的元素
FD_SET(sockSrv, &fdSocket); //将 sockSrv 加入 fdSocket 集合 while(TRUE)
{
fd_set fdRead = fdSocket;
int nRet = select(0, &fdRead, NULL, NULL, NULL);
if(nRet > 0)
{
for(int i=0; i<(int)fdSocket.fd_count; ++i)
{
if(FD_ISSET(fdSocket.fd_array[i], &fdRead))
{
if(fdSocket.fd_array[i] == sockSrv)
{
if(fdSocket.fd_count < FD_SETSIZE)
{
SOCKADDR_IN addrClient;
int len = sizeof(SOCKADDR); SOCKET sockClient = accept(sockSrv, (SOCKADDR*)&addrClient, &len);
FD_SET(sockClient, &fdSocket); //加入到 fdSocket
cout << "收到连接:" << inet_ntoa(addrClient.sin_addr) << "[" << fdSocket.fd_count - 1 << "]" << endl; }
else
{
cout << "连接过多" << endl;
continue;
}
}
else
{
char strRecv[256];
int nRecv = recv(fdSocket.fd_array[i], strRecv, 256, 0);
if(nRecv > 0)
{
strRecv[nRecv] = '\0';
cout << "收到数据:" << strRecv << endl;
}
else
{
closesocket(fdSocket.fd_array[i]);
FD_CLR(fdSocket.fd_array[i], &fdSocket);
}
}
}
}
}
else
{
cout << "select 失败" << endl;
break;
}
} return 0;
}
请教:
1:
if(FD_ISSET(fdSocket.fd_array[i], &fdRead))
这句话的作用是什么?
和 fdRead 比较 有什么意义?2:
if(fdSocket.fd_array[i] == sockSrv)
这句话是什么意思?
为什么是 if(fdSocket.fd_array[i] == sockSrv)
{
//为什么是执行这里
SOCKADDR_IN addrClient; //客户端地址
int len = sizeof(SOCKADDR); //长度 SOCKET sockClient = accept(sockSrv, (SOCKADDR*)&addrClient, &len);
FD_SET(sockClient, &fdSocket); //加入到 fdSocket
}
else
{
//为什么是这行这里
char strRecv[256];
int nRecv = recv(fdSocket.fd_array[i], strRecv, 256, 0);
}谢谢!
FD_SET(sockSrv, &fdSocket); //将 sockSrv 加入 fdSocket 集合
也有与客户端连接进行读写的Socket,通过:
FD_SET(sockClient, &fdSocket); //加入到 fdSocket
加入的。所以要确定(if(fdSocket.fd_array[i] == sockSrv))当前处理的是哪一个(种)Socket,分别采取不同的行动,也就是if/else里的两种行动。
监听连接的 socket
和
数据变化的是这个意思不?