VC控制台网络消息获取

ReturnBtoo 2004-08-27 02:28:05
程序的问题是不知道怎么设置消息的入口函数

int main(int argc, char* argv[])
{
//Get Title
M_HWND=FindWindow(///);

//inti the socket array
// Create Application Thread
// Create Send Thread

//Create Message Loop
while(true) {
if(PeekMessage(&M_MSG,NULL,0,0,PM_NOREMOVE)){
if(!GetMessage(&M_MSG,NULL,0,0))
return M_MSG.wParam;
TranslateMessage(&M_MSG);
DispatchMessage(&M_MSG);
}
}
return 1;
}

static DWORD WINAPI ApplicationThread(LPVOID pVoid)
{
int nRetCode;

WSADATA m_WsaData;
UINT m_VersionSock;
//Test Socket Version
printf("Test Socket Version\n");
m_VersionSock=MAKEWORD(2,2);
nRetCode = WSAStartup(m_VersionSock, &m_WsaData);
if (nRetCode == SOCKET_ERROR){
printf("Version Error.\n");
return 0;
}
//Create Socket
printf("Create Socket\n");
m_ServerSocket = socket(AF_INET,
SOCK_STREAM,
IPPROTO_TCP);

if (m_ServerSocket < 0){
printf("fail to Create Socket.\n");
return 0;
}
m_ServAddr.sin_family=AF_INET;
m_ServAddr.sin_addr.S_un.S_addr=inet_addr(SERVER_TCP_IP);//htonl(INADDR_ANY);
m_ServAddr.sin_port=htons(SERVER_TCP_PORT);

//bind the socket to local ip and port
printf("bind the socket to local ip and port\n");
nRetCode=bind(m_ServerSocket,(struct sockaddr*)&m_ServAddr,sizeof(m_ServAddr));
if(nRetCode==0){

}
else{
printf("Bind=%d\n",nRetCode);
return nRetCode;
}

nRetCode=WSAAsyncSelect(m_ServerSocket, M_HWND, WM_USER+14, //allocate message number to socket event
FD_ACCEPT | FD_CLOSE | FD_READ | FD_WRITE);
if(nRetCode==0){
printf("Select Success!\n");
}
else{
printf("Fail to Select, Return Value = %d\n",nRetCode);
}
//listen
printf("Listen the Connect Request\n");
nRetCode=listen(m_ServerSocket,10);
if(nRetCode==0){
printf("ServerSocket Id=%d\n",m_ServerSocket);
printf("Server Windows Hwnd=%d\n",M_HWND);
}else{
printf("listen=%d\n",nRetCode);
return nRetCode;
}

return 1;
以上都没有问题//
}
//做了很多尝试,函数不能获得网络消息。
LRESULT CALLBACK WndProc(HWND M_HWND,unsigned M_MSG,WPARAM wParam,LPARAM lParam)
{
long i;
int m_AddSize;
int nRetCode
switch(M_MSG)
{

case WM_PAINT:
break;
case WM_USER+14:
if(WSAGETSELECTERROR(lParam)){
closesocket(wParam);
break;
}
switch(WSAGETSELECTEVENT(lParam)){
case FD_ACCEPT: break;
case FD_READ:
//HANDLE FD_READ EVENT
break;
case FD_WRITE:
break;
case FD_CLOSE:


break;
}
break;
default:
return DefWindowProc(M_HWND,M_MSG,wParam,lParam);
break;
}
return 0;
}
请大家帮忙
...全文
231 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
yuantao 2004-09-01
  • 打赏
  • 举报
回复
晕哦,怎么能在console下这么写啊,最好是用WSAAsyncSelect啊,两者模型差不多啊.而且不需要使用窗口消息,不过用WSAAsyncSelect也是可以的,你自己创建1个窗口,不显示就可以了.具体的window网络编程上面有例子啊.,
PiggyXP 2004-08-31
  • 打赏
  • 举报
回复
既然是控制台程序就不要使用WSAAsyncSelect了,换WSAEventSelect吧,也是差不多的
ReturnBtoo 2004-08-31
  • 打赏
  • 举报
回复
请问在WIN32平台上,在哪种程序框架上建立何种I/O效率最高?
mahatma_cn 2004-08-29
  • 打赏
  • 举报
回复
不要使用WSAAsyncSelect,使用select,或者完成端口、重叠i/o.
howtotell 2004-08-27
  • 打赏
  • 举报
回复
用一个死循环来监视就可以了,不用窗口消息来触发.
///////////////////////////////////////////////////////////////////
//Name:Server.cpp
//Description:Chatting server implement
//
//Author:
//Last Update:2004/6/28
///////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "winsock.h"
#include "windows.h"
#pragma comment(lib,"ws2_32")
#define MAX_USER 20
#define MAX_MESSAGE_LENGTH 256
#define ERR -1
#define OK 0

//User information
struct _USERINFO
{
char ip[32]; //IP address
char user[16]; //User name
bool IsAlive; //online signature true:online, false :not online
int port; //listening port of the user
}USERINFO[MAX_USER];

typedef struct _MESSAGE
{
char ip[32]; //User's IP address
int port; //listing port of the source user
char user[32]; //Source user's name
char dest[32]; //Destination user's name
char content[256]; //The content of the message
char attribute[32]; //The attribute of the message
}MESSAGE;
MESSAGE message;

int nUserCounter=0;

int ListenConnect();
int SendMsg(char* ip,int port,char* attribute,char* content);
unsigned long _stdcall ListenThread(void* pParam);
int QueryUser(char* user);
int AddUser(char* user,char* ip,int port,bool IsAlive);
int DelUser(char* user,char* ip,bool IsAlive);
char* QueryIP(char* user);
int QueryPort(char* user);
void BroadCastMsg(char* content);

int main(int argc, char* argv[])
{
printf("/////////////////////////////////////////////////////\r\n");
printf("// Welcome to use howtotell chatting server. //\r\n");
printf("// Copyright 2004 All right reserved. //\r\n");
printf("/////////////////////////////////////////////////////\r\n\r\n");
printf("The server started successfully.\r\nNow listening...\r\n");


CreateThread(NULL,0,&ListenThread,0,0,0);
Sleep(1000);

char cmd[32];
memset(cmd,0,32);
while(strcmp(cmd,"stop")!=0)
{
gets(cmd);
}

return OK;
}


int ListenConnect()
{
struct sockaddr_in sin;
WSADATA wsaData;
SOCKET sockSrvr,sockRecv;

if(WSAStartup(MAKEWORD(1, 1), &wsaData ))
{
printf("TCP/IP stack initialise error!\r\n");
return ERR;
}

if(wsaData.wVersion != MAKEWORD(1, 1))
{
printf("Winsock version is incorrect!\r\n");
WSACleanup();
return ERR;
}

sin.sin_addr.S_un.S_addr=INADDR_ANY;
sin.sin_family=AF_INET;
sin.sin_port=htons(8000);

if((sockSrvr = socket (PF_INET, SOCK_STREAM, IPPROTO_TCP))==SOCKET_ERROR)
{
printf("sockSrvr error\r\n");
return ERR;
}
if((sockRecv = socket (PF_INET, SOCK_STREAM, IPPROTO_TCP))==SOCKET_ERROR)
{
printf("sockRecv error\r\n");
return ERR;
}

if(sockSrvr==SOCKET_ERROR||sockRecv==SOCKET_ERROR)
{
printf("socket create error\r\n");
return ERR;
}

if(bind(sockSrvr,(SOCKADDR *)&sin,sizeof(sin))<0)
{
printf("bind error\r\n");
return ERR;
}

listen(sockSrvr,5);
int length=sizeof(sin);
sockRecv=accept(sockSrvr,(struct sockaddr*)&sin,&length);
if(sockRecv==INVALID_SOCKET)
{
printf("accept error \r\n");
return ERR;
}

memset(&message,0,sizeof(MESSAGE));
recv(sockRecv,(char*)&message,sizeof(MESSAGE),0);

//Broadcast message
if(strcmp(message.attribute,"public")==0)
{
BroadCastMsg(message.content);

closesocket(sockRecv);
closesocket(sockSrvr);
WSACleanup();
return OK;
}

//Specified user is existent and is on line
if(QueryUser(message.dest)!=-1)
{
printf("%s (%s)> %s \r\n",message.user,message.ip,message.content);
strcat(message.content,"<Server delivered>");
SendMsg(QueryIP(message.dest),QueryPort(message.dest),message.attribute,message.content);
}
else
{
if(strcmp(message.dest,"@HOWTOTELL_SERVER")==0)//Reserved user name,this is the handshake signal
{
if(strcmp(message.content,"HAND_SHAKE")==0)
{
AddUser(message.user,message.ip,message.port,true);

strcpy(message.content,"Welcome to howtotell chatting server!\r\n");
strcat(message.content,"////////////User List ////////////////\r\n");
for(int i=0;i<MAX_USER;i++)
{
if(strlen(USERINFO[i].user)>0)
{
strcat(message.content,USERINFO[i].user);
strcat(message.content,"\r\n");
}
}
strcat(message.content,"//////////////////////////////////////\r\n");
printf("%s (%s)> %s \r\n",message.user,message.ip,"Logged in");
BroadCastMsg(message.content);
}
else
{
DelUser(message.user,message.ip,false);
sprintf(message.content,
"Chatting server system message:\r\nUser leaved:\r\n%s %s\r\n",
message.user,message.ip);

printf("%s (%s)> %s \r\n",message.user,message.ip,"Logged Out");
BroadCastMsg(message.content);
}
}
else //user is not existent
{
printf("user %s is not on line now\r\n",message.dest);
SendMsg(message.ip,message.port,message.attribute,"User is not on line\r\n");
}
}

closesocket(sockRecv);
closesocket(sockSrvr);
WSACleanup();

return OK;
}


int SendMsg(char* ip,int port,char* attribute,char* content)
{
struct sockaddr_in sin;
WSADATA wsaData;
SOCKET sockClient;
char *IpAddr;

IpAddr=new char[64];
memset(IpAddr,0,64);

strcpy(IpAddr,ip);

if(WSAStartup(0x0101, &wsaData ))
{
printf("Init TCP/IP stack error ");
return ERR;
}
if(wsaData.wVersion != 0x0101)
{
printf("Winsock version error");
WSACleanup();
return ERR;
}

if ((sockClient = socket (PF_INET, SOCK_STREAM, IPPROTO_IP)) == INVALID_SOCKET)
{
printf("create socket error!");
return ERR;
}

sin.sin_family=AF_INET;
sin.sin_addr.s_addr=inet_addr(IpAddr);
sin.sin_port=htons((short)port);


if(connect (sockClient, (struct sockaddr *)&sin, sizeof (sin)) == SOCKET_ERROR)
{
printf("connect error");
closesocket(sockClient);
WSACleanup();
return ERR;
}
else
{
strcpy(message.content, content);
send(sockClient,(char*)&message,sizeof(MESSAGE),0);
}

closesocket (sockClient);
WSACleanup();
return OK;
}

unsigned long _stdcall ListenThread(void* pParam)
{
while(1)
{
if(ListenConnect()==ERR)
{
break;
}
}

return OK;
}


int QueryUser(char* user)
{
for(int i=0;i<MAX_USER;i++)
{
if(strcmp(user,USERINFO[i].user)==0&&USERINFO[i].IsAlive)
{
return i; //Specified user is existential and is on line
}
}

return ERR;
}

int AddUser(char* user,char* ip,int port,bool IsAlive)
{
if(QueryUser(user)!=-1)
{
return ERR;
}

//Specified user is not existential
for(int i=0;i<MAX_USER;i++)
{
if(strlen(USERINFO[i].user)==0||!USERINFO[i].IsAlive)
{
strcpy(USERINFO[i].user,user);
strcpy(USERINFO[i].ip,ip);
USERINFO[i].IsAlive=IsAlive;
USERINFO[i].port=port;
break;
}
}

return OK;
}

int DelUser(char* user,char* ip,bool IsAlive)
{
for(int i=0;i<MAX_USER;i++)
{
if(strcmp(USERINFO[i].user,user)==0)
{
strcpy(USERINFO[i].user,"");
USERINFO[i].IsAlive=false;
}
}
return OK;
}

char* QueryIP(char* user)
{
for(int i=0;i<MAX_USER;i++)
{
if(strcmp(USERINFO[i].user,user)==0)
{
return USERINFO[i].ip;
}
}

return "";
}

int QueryPort(char* user)
{
for(int i=0;i<MAX_USER;i++)
{
if(strcmp(USERINFO[i].user,user)==0)
{
return USERINFO[i].port;
}
}

return ERR;
}

void BroadCastMsg(char* content)
{
for(int i=0;i<MAX_USER;i++)
{
if(strlen(USERINFO[i].user)>0&&USERINFO[i].IsAlive)
{
SendMsg(USERINFO[i].ip,USERINFO[i].port,"public",content);
}
}

printf("Broadcasting Message %s(%s)>%s\r\n",message.user,message.ip,content);
}
ReturnBtoo 2004-08-27
  • 打赏
  • 举报
回复
自己顶一下,没有人会吗?
ReturnBtoo 2004-08-27
  • 打赏
  • 举报
回复
后面的建立线程是肯定没有问题,考虑到这些不是帖子关心的重点所有简略了。
控制台程序中如何让WINDOWPRO函数成为消息的入口?
oyljerry 2004-08-27
  • 打赏
  • 举报
回复
你得到句柄后的操作呢
ReturnBtoo 2004-08-27
  • 打赏
  • 举报
回复
有人吗?
ReturnBtoo 2004-08-27
  • 打赏
  • 举报
回复
M_HWND已经成功获得了控制台的句柄
starshx 2004-08-27
  • 打赏
  • 举报
回复
成功了,没有问题的。
DentistryDoctor 2004-08-27
  • 打赏
  • 举报
回复
M_HWND=FindWindow(///);
是否成功?

18,363

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧