// Server.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <Windows.h>
#include <vector>
#include <algorithm>
using namespace std;
#pragma comment(lib,"ws2_32.lib")
vector<SOCKET> socketArry(10,0);
int initWSA()
{
WSADATA wsaData;
if(0!=WSAStartup(MAKEWORD(2,2),&wsaData))
{
printf("初始化网络失败错误代码 =%d",WSAGetLastError());
WSACleanup();
return 0;
}
printf("网络环境初始化成功!");
return 1;
}
SOCKET createSocket()
{
SOCKET serverSocket =socket(AF_INET,SOCK_STREAM,0);
if (serverSocket == INVALID_SOCKET )
{
printf("创建套接字失败!错误代码=%d",WSAGetLastError());
closesocket(serverSocket);
}
else
printf("创建套接字成功!\n");
return serverSocket;
}
void SendBuff(SOCKET s,char *buff,int len)
{
vector<SOCKET>::iterator it = socketArry.end();
for (vector<SOCKET>::iterator i= socketArry.begin();i!=it;i++ )
{
if (*i!=0)
{
int dataLen = len;
int sendLen =0;
int sendCount =0;
while(dataLen>0)
{
sendLen = send(*i,buff+sendCount,dataLen-sendLen,0);
if (sendLen==SOCKET_ERROR )
{
printf("发送给客户端出错\n");
break;
}
if (sendLen ==0)
{
printf("客户端已经关闭\n");
break;
}
sendCount+=sendLen;
dataLen-=sendLen;
}
}
}
}
void RecvData(SOCKET s,char *buf,int& len)
{
char buff[2048];
int recvLen=0;
int countDatalen =0;
while(1)
{
if (countDatalen>2048)
{
printf("数据太大!\n");
break;;
}
recvLen =recv(s,buff+countDatalen,sizeof(buff)-countDatalen,0);
countDatalen+=recvLen;
if (recvLen ==0)
{
printf("客户端socket已经关闭\n");
vector<SOCKET> ::iterator i = find(socketArry.begin(),socketArry.end(),s);
if(i!=socketArry.end())
*i = 0;
break;
}
else if (recvLen<sizeof(buff))
{
printf("数据接收完成!\n");
break;;
}
}
memcpy(buf,buff,countDatalen);
len = countDatalen;
}
int _tmain(int argc, _TCHAR* argv[])
{
// SOCKET socketArry[10];
// socketArry.push_back(INVALID_SOCKET);
// vector<SOCKET>::iterator i= socketArry.begin();
// socketArry.insert(i,INVALID_SOCKET);
// *i = INVALID_SOCKET;
int size = socketArry.size();
// memset(socketArry,0,sizeof(socketArry));
if (!initWSA())
goto mark;
SOCKET ServerSocket = createSocket();
if (ServerSocket == INVALID_SOCKET)
goto mark;
SOCKADDR_IN serverInfo;
serverInfo.sin_family = AF_INET;
serverInfo.sin_port = htons(9100);
serverInfo.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
int infoLen = sizeof(serverInfo);
int err =bind(ServerSocket,(SOCKADDR*)&serverInfo,infoLen);
if (err !=0)
{
printf("绑定IP=%s,端口=%d失败!错误代码=%d\n",inet_ntoa(serverInfo.sin_addr),ntohs(serverInfo.sin_port),WSAGetLastError());
closesocket(ServerSocket);
goto mark;
}
printf("绑定IP=%s,端口=%d成功!\n",inet_ntoa(serverInfo.sin_addr),ntohs(serverInfo.sin_port));
err = listen(ServerSocket,10);
if(err == SOCKET_ERROR )
{
printf("监听失败!错误代码=%d",WSAGetLastError());
goto mark;
}
while(1)
{
int index =0;
printf("端口正在监听....");
SOCKADDR_IN ClientInfo;
int inFoLen = sizeof(ClientInfo);
SOCKET ClientSoocket= accept(ServerSocket,(SOCKADDR*)&ClientInfo,&inFoLen);
if (ClientSoocket == INVALID_SOCKET)
{
closesocket(ClientSoocket);
printf("客户端连接请求失败!错误代码=%d\n",WSAGetLastError());
goto mark;
}
printf("客户端:%s 连接端口=%d成功\n",inet_ntoa(ClientInfo.sin_addr),ntohs(ClientInfo.sin_port));
/* for (int i=0; i<10;i++)
{
if (socketArry[i] == 0)
{
socketArry[i] = ClientSoocket;
}
}
*/
vector<SOCKET> ::iterator i = find(socketArry.begin(),socketArry.end(),0);
if(i!=socketArry.end())
*i = ClientSoocket;
char buff[2048];
int len =0;
RecvData(ClientSoocket,buff,len);
printf("客户端:%s 发来数据%s\n",inet_ntoa(ClientInfo.sin_addr),buff);
SendBuff(ClientSoocket,buff,len);
}
mark: system("pause");
WSACleanup();
closesocket(ServerSocket);
return 0;
}