#include <iostream>
#include <winsock2.h>
#include <vector>
#pragma comment(lib, "ws2_32.lib")
using namespace std;
#define PORT 12345
#define BUFFER_SIZE 1024
int main(int argc, char* argv[])
{
WSADATA wsaData;
if(WSAStartup(MAKEWORD(2,2),&wsaData) != 0)
{
std::cout << " lib error ";
WSACleanup();
return -1;
}
SOCKET listenSocket;
if((listenSocket = socket(AF_INET, SOCK_STREAM,0)) == INVALID_SOCKET)
{
std::cout << "socket error ";
WSACleanup();
return -1;
}
SOCKADDR_IN addr;
memset(&addr,0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(PORT);
addr.sin_addr.s_addr = htonl(ADDR_ANY);
if(bind(listenSocket,(sockaddr*)&addr,sizeof(addr)) == SOCKET_ERROR)
{
std::cout << "bind error ";
WSACleanup();
return -1;
}
listen(listenSocket,100);
//将socket设为nonBlock
u_long nonBlock = 1;
if(ioctlsocket(listenSocket,FIONBIO,&nonBlock) == SOCKET_ERROR)
{
printf("ioctlsocket() error ");
return -1;
}
FD_SET readSet;
FD_SET writeSet;
vector<SOCKET> socketArray;
char buf[BUFFER_SIZE];
for(;;)
{
FD_ZERO(&readSet);
//FD_ZERO(&writeSet);
//将listen socket加入,测试是否有新连接
FD_SET(listenSocket,&readSet);
//将连接的socket加入readset,测试是否可读
vector<SOCKET>::iterator it;
for(it = socketArray.begin(); it != socketArray.end(); ++it)
{
FD_SET(*it,&readSet);
//FD_SET(*it,&writeSet);
}
int total = select(0,&readSet,0,NULL,0); //阻塞直到有socket可读
if(total == SOCKET_ERROR)
{
printf("select() error ");
return -1;
}
//判断是否有新连接
if(FD_ISSET(listenSocket,&readSet))
{
SOCKADDR_IN connectAddr;
int len = sizeof(connectAddr);
SOCKET socket = accept(listenSocket,(sockaddr*)&connectAddr,&len);
cout << "new connecter: " << inet_ntoa(connectAddr.sin_addr) <<":" << ntohs(connectAddr.sin_port)<< endl;
socketArray.push_back(socket);
total--;
}
//检查数组中的socket是否可读
for(it = socketArray.begin(); total > 0 && it != socketArray.end();)
{
if(FD_ISSET(*it,&readSet))
{
total--;
int ret = recv(*it,buf,1024,0);
if(ret == 0)//对方关闭连接
{
closesocket(*it);
it = socketArray.erase(it);//从数组中删除该socket
}
else
{
send(*it,buf,ret,0);//echo
}
}
/*
if(FD_ISSET(*it,&writeSet))
{
}
*/
it++;
}
}
return 0;
}
#include <winsock2.h>
#include <vector>
#pragma comment(lib, "ws2_32.lib")
using namespace std;
#define PORT 12345
#define BUFFER_SIZE 1024
int main(int argc, char* argv[])
{
WSADATA wsaData;
if(WSAStartup(MAKEWORD(2,2),&wsaData) != 0)
{
std::cout << " lib error ";
WSACleanup();
return -1;
}
SOCKET listenSocket;
if((listenSocket = socket(AF_INET, SOCK_STREAM,0)) == INVALID_SOCKET)
{
std::cout << "socket error ";
WSACleanup();
return -1;
}
SOCKADDR_IN addr;
memset(&addr,0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(PORT);
addr.sin_addr.s_addr = htonl(ADDR_ANY);
if(bind(listenSocket,(sockaddr*)&addr,sizeof(addr)) == SOCKET_ERROR)
{
std::cout << "bind error ";
WSACleanup();
return -1;
}
listen(listenSocket,100);
//将socket设为nonBlock
u_long nonBlock = 1;
if(ioctlsocket(listenSocket,FIONBIO,&nonBlock) == SOCKET_ERROR)
{
printf("ioctlsocket() error ");
return -1;
}
FD_SET readSet;
FD_SET writeSet;
vector<SOCKET> socketArray;
char buf[BUFFER_SIZE];
for(;;)
{
FD_ZERO(&readSet);
//FD_ZERO(&writeSet);
//将listen socket加入,测试是否有新连接
FD_SET(listenSocket,&readSet);
//将连接的socket加入readset,测试是否可读
vector<SOCKET>::iterator it;
for(it = socketArray.begin(); it != socketArray.end(); ++it)
{
FD_SET(*it,&readSet);
//FD_SET(*it,&writeSet);
}
int total = select(0,&readSet,0,NULL,0); //阻塞直到有socket可读
if(total == SOCKET_ERROR)
{
printf("select() error ");
return -1;
}
//判断是否有新连接
if(FD_ISSET(listenSocket,&readSet))
{
SOCKADDR_IN connectAddr;
int len = sizeof(connectAddr);
SOCKET socket = accept(listenSocket,(sockaddr*)&connectAddr,&len);
cout << "new connecter: " << inet_ntoa(connectAddr.sin_addr) <<":" << ntohs(connectAddr.sin_port)<< endl;
socketArray.push_back(socket);
total--;
}
//检查数组中的socket是否可读
for(it = socketArray.begin(); total > 0 && it != socketArray.end();)
{
if(FD_ISSET(*it,&readSet))
{
total--;
int ret = recv(*it,buf,1024,0);
if(ret == 0)//对方关闭连接
{
closesocket(*it);
it = socketArray.erase(it);//从数组中删除该socket
}
else
{
send(*it,buf,ret,0);//echo
}
}
/*
if(FD_ISSET(*it,&writeSet))
{
}
*/
it++;
}
}
return 0;
}