#include<winsock2.h>
#include<ws2tcpip.h>
#include<windows.h>
#include<stdio.h>
#include<conio.h>
#pragma comment(lib,"ws2_32.lib")
#define DEFAULT_BUFLEN 512
#define DEFAULT_PORT 27015
int _tmain()
{
WSABUF DataBuf;
char buffer[DEFAULT_BUFLEN];
DWORD EventTotal =0,RecvBytes=0,Flags=0,BytesTransferred=0;
WSAEVENT EventArray[WSA_MAXIMUM_WAIT_EVENTS];
WSAOVERLAPPED AcceptOverlapped;
WSADATA wsaData;
int iResult;
SOCKET SeverSocket = INVALID_SOCKET;
//inniting......
iResult = WSAStartup(MAKEWORD(2,2),&wsaData);
if(iResult != 0)
{
//WSAStartup failed!\r\n
return 1;
}
//创建监听套接字
SeverSocket = WSASocket(AF_INET,SOCK_STREAM,IPPROTO_IP,NULL,0,WSA_FLAG_OVERLAPPED);
if(SeverSocket == INVALID_SOCKET)
{
//socket failed!
WSACleanup();
return 1;
}
//binding.....
SOCKADDR_IN addrServ;
addrServ.sin_family = AF_INET;
addrServ.sin_port = htons(DEFAULT_PORT);
addrServ.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
iResult = bind(SeverSocket, (const struct sockaddr*)&addrServ,sizeof(SOCKADDR_IN));
if(iResult == SOCKET_ERROR)
{
//Bind failed!
closesocket(SeverSocket);
WSACleanup();
return 1;
}
iResult = listen(SeverSocket,SOMAXCONN);
if(iResult == SOCKET_ERROR)
{
//Listen failed!
closesocket(SeverSocket);
WSACleanup();
return -1;
}
//Tcp sever strting...
//创建事件对象,建立重叠结构
EventArray[EventTotal] = WSACreateEvent();
ZeroMemory(buffer,DEFAULT_BUFLEN);
ZeroMemory(&AcceptOverlapped,sizeof(WSAOVERLAPPED));
AcceptOverlapped.hEvent = EventArray[EventTotal];
DataBuf.len= DEFAULT_BUFLEN;
DataBuf.buf = buffer;
EventTotal++;
SOCKADDR_IN addrClient;
int addrClientlen = sizeof(SOCKADDR_IN);
SOCKET AcceptSocket;
//循环处理客户端连接请求
while(TRUE)
{
AcceptSocket = accept(SeverSocket,(SOCKADDR FAR*)&addrClient,&addrClientlen);
if(AcceptSocket = INVALID_SOCKET)
{
//accept failed..
closesocket(SeverSocket);
WSACleanup();
return 0;
}
//接收到新链接 IP :inet_ntoa(addrClient.sin_addr);
while(TRUE)
{
DWORD Index;
iResult = WSARecv(AcceptSocket,&DataBuf,1,&RecvBytes,&Flags,&AcceptOverlapped,NULL);
if(iResult = SOCKET_ERROR)
{
//error
}
Index = WSAWaitForMultipleEvents(EventTotal,EventArray,FALSE,WSA_INFINITE,FALSE);
WSAGetOverlappedResult(AcceptSocket,&AcceptOverlapped,&BytesTransferred,FALSE,&Flags);
if(BytesTransferred ==0)
{
//Closing socket
closesocket(AcceptSocket);
break;
}
//success in receiving.....
//deal with data....
//重置已授信的事件对象
WSAResetEvent(EventArray[Index - WSA_WAIT_EVENT_0]);
//重置flags变量和重叠结构
Flags = 0;
ZeroMemory(&AcceptOverlapped,sizeof(WSAOVERLAPPED));
ZeroMemory(buffer,DEFAULT_BUFLEN);
AcceptOverlapped.hEvent = EventArray[Index - WSA_WAIT_EVENT_0];
//重置缓冲区
DataBuf.len = DEFAULT_BUFLEN;
DataBuf.buf = buffer;
}
}
return 0;
}