IOServer端:
#include <iostream>
#include <WinSock2.h>
#include <tchar.h>
using namespace std;
#pragma comment(lib,"Ws2_32.lib")
#define PORT 6000
#define MSGSIZE 256
int g_iTotalConn = 0;
SOCKET g_cltSocketArr[FD_SETSIZE];
void threadProc(LPVOID lpParam)
{
fd_set fdread;
struct timeval tv = {1,0};
char szMessage[MSGSIZE] = {0};
while(true)
{
FD_ZERO(&fdread);
for(int i=0;i<g_iTotalConn;i++)
{
FD_SET(g_cltSocketArr[i],&fdread);
}
int ret = select(0,&fdread,NULL,NULL,&tv);
if(0 == ret)
continue;
for(int i=0;i<g_iTotalConn;i++)
{
if(FD_ISSET(g_cltSocketArr[i],&fdread))
{
ret = recv(g_cltSocketArr[i],szMessage,MSGSIZE,0);
if(0 == ret || (ret == SOCKET_ERROR && WSAGetLastError() == WSAECONNRESET))
{
closesocket(g_cltSocketArr[i]);
if(i<g_iTotalConn-1)
{
g_cltSocketArr[i--] = g_cltSocketArr[--g_iTotalConn];
}
}
cout<<"server"<<i<<" recv:"<<szMessage<<endl;
}
else
{
szMessage[ret] = '\0';
send(g_cltSocketArr[i],szMessage,strlen(szMessage),0);
}
}
}
}
void main(int argc,TCHAR*argv[])
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 2, 2 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 )
{
return ;
}
if ( LOBYTE( wsaData.wVersion ) != 2 ||
HIBYTE( wsaData.wVersion ) != 2 )
{
WSACleanup( );
return;
}
SOCKET sockSrv = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
SOCKADDR_IN addrClient;
addrClient.sin_addr.S_un.S_addr = htons(INADDR_ANY);
addrClient.sin_family = AF_INET;
addrClient.sin_port = htons(PORT);
bind(sockSrv,(SOCKADDR*)&addrClient,sizeof(SOCKADDR));
listen(sockSrv,5);
SOCKADDR_IN addrConn;
int len = sizeof(SOCKADDR);
CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)threadProc,NULL,0,NULL);
char szMessage[MSGSIZE];
while(true)
{
SOCKET sockConn = accept(sockSrv,(SOCKADDR*)&addrConn,&len);
// int nSize = recv(sockConn,szMessage,MSGSIZE,0);
// szMessage[nSize] = '\0';
// cout<<"Server recv : "<<szMessage<<endl;
// A
// gets(szMessage);
// send(sockConn,szMessage,strlen(szMessage),0);
//
// closesocket(sockConn);
g_cltSocketArr[g_iTotalConn++] = sockConn;
}
closesocket(sockSrv);
WSACleanup();
}
IOClient端:
#include <iostream>
#include <WinSock2.h>
#include <tchar.h>
using namespace std;
#pragma comment(lib,"Ws2_32.lib")
#define SERVER_ADDRESS "127.0.0.1"
#define PORT 6000
#define MSGSIZE 256
void main(int argc,TCHAR*argv[])
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 2, 2 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 )
{
return;
}
if ( LOBYTE( wsaData.wVersion ) != 2 ||
HIBYTE( wsaData.wVersion ) != 2 )
{
WSACleanup( );
return;
}
SOCKET sockClient = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr = inet_addr(SERVER_ADDRESS);
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(PORT);
connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
char szMessage[MSGSIZE] = {0};
while(true)
{
gets(szMessage);
send(sockClient,szMessage,strlen(szMessage),0);
int nSize = recv(sockClient,szMessage,MSGSIZE,0);
szMessage[nSize] = '\0';
cout<<"Client recv: "<<szMessage<<endl;
}
closesocket(sockClient);
WSACleanup();
}