📄 servermfc.cpp
字号:
// ServerMFC.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "stdio.h"
#include <winsock2.h>
#include <mswsock.h>
#include "ProdConsModel.h"
#include "ServerMFC.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// The one and only application object
CWinApp theApp;
using namespace std;
char *IP_ADDR="127.0.0.1";
int IP_PORT=5678;
const int MAX_BUF=10240;
CProdConsModel *pcModel;
DWORD WINAPI ProducerThread(LPVOID lparam);
DWORD WINAPI ConsumerThread(LPVOID lparam);
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
pcModel = new CProdConsModel(10);
//initialize Winsock
WSADATA wsaData;
int iRet=WSAStartup(MAKEWORD(2,2),&wsaData);
if(iRet!=NO_ERROR) printf("Error at WSAStartup()\n");
//create a socket
SOCKET m_socket;
m_socket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(m_socket==INVALID_SOCKET)
{
printf("Error at socket():%ld\n",WSAGetLastError());
WSACleanup();
return -1;
}
//bind a socket
sockaddr_in service;
service.sin_family=AF_INET;
service.sin_addr.s_addr=inet_addr(IP_ADDR);
service.sin_port=htons(IP_PORT);
if(bind(m_socket,(SOCKADDR*)&service,sizeof(service))==SOCKET_ERROR)
{
printf("bind() failed.\n"); service.sin_addr.s_addr;
closesocket(m_socket);
return 0;
}
//listen on a socket
if(listen(m_socket,20)==SOCKET_ERROR) printf("Error listening on socket.\n");
//accept a connection
SOCKET AcceptSocket;
struct sockaddr_in m_clientAddr;
int m_iclientAddr_Len=sizeof(struct sockaddr);
int clientsock = 0;
//Consumer Thread
DWORD dwConsumerThreadId;
HANDLE hConsumerThread;
hConsumerThread=CreateThread(NULL,NULL, ConsumerThread,(LPVOID)pcModel,0,&dwConsumerThreadId);
if(hConsumerThread==NULL)
{
printf("CreatConsumerThread AnswerThread() failed.\n");
return 0;
}
printf("\nWaiting for a client to connect...\n");
while(1)
{
AcceptSocket=accept(m_socket,(struct sockaddr*)&m_clientAddr,(int *)&m_iclientAddr_Len);
printf("Client Connected ipAddr:%s,socket handle:%d\n", inet_ntoa(m_clientAddr.sin_addr),AcceptSocket);
DWORD dwProducerThreadId;
HANDLE hProducerThread;
hProducerThread=CreateThread(NULL,NULL, ProducerThread,
(LPVOID)AcceptSocket,0,&dwProducerThreadId);
if(hProducerThread==NULL)
{
closesocket(AcceptSocket);
printf("CreatProducerThread AnswerThread() failed.\n");
}
else {
// int m_iConnNUm=pushSocket(AcceptSocket);
// printf("Now client connection numn:%d\n",m_iConnNUm);
}
}
//clean
closesocket(m_socket);
WSACleanup();
if (pcModel!=NULL) delete pcModel;
return 0;
}
DWORD WINAPI ProducerThread(LPVOID lparam)
{
SOCKET ClientSocket=(SOCKET)(LPVOID)lparam;
pcModel->set(ClientSocket);
return 0;
}
int ResponseClient(SOCKET acceptClient)
{
int bytesRecv;
int bytesSend;
char sendbuf[MAX_BUF]="";
char recvbuf[MAX_BUF]="";
while(1)
{
memset(recvbuf,0,sizeof(recvbuf));
//Receiving Data
printf("Wait recv...\n");
bytesRecv=recv(acceptClient,recvbuf,MAX_BUF,0);
if (bytesRecv<=0) break;
//Write your processing code here
bytesSend=send(acceptClient,recvbuf,bytesRecv,0);
printf("send data:%s\n",recvbuf);
if (bytesSend<=0) break;
}
printf("close client socket:%d\n",acceptClient);
closesocket(acceptClient);
return 0;
}
DWORD WINAPI ConsumerThread(LPVOID lparam)
{
for (;;)
{
CProdConsModel* m_pc = (CProdConsModel*)lparam;
SOCKET ClientSocket=(SOCKET)m_pc->get();
ResponseClient(ClientSocket);
}
return 0;
}
/*DWORD WINAPI ProducerThread(LPVOID lparam)
{
SOCKET ClientSocket=(SOCKET)(LPVOID)lparam;
int bytesRecv;
int bytesSend;
char sendbuf[MAX_BUF]="";
char recvbuf[MAX_BUF]="";
while(1)
{
memset(recvbuf,0,sizeof(recvbuf));
//Receiving Data
printf("Wait recv...\n");
bytesRecv=recv(ClientSocket,recvbuf,MAX_BUF,0);
if (bytesRecv<=0) break;
//Write your processing code here
bytesSend=send(ClientSocket,recvbuf,bytesRecv,0);
printf("send data:%s\n",recvbuf);
if (bytesSend<=0) break;
}
//removeSocket(ClientSocket);
printf("close client socket:%d\n",ClientSocket);
closesocket(ClientSocket);
return 0;
}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -