⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 servermfc.cpp

📁 C++解决的一个生产者消费者模型
💻 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 + -