您的位置:首页 > 其它

多线程的聊天室程序的服务器端完成

2005-05-24 16:52 627 查看
调试的时候范了点小错误
void __cdecl ReceiveMessage(void* lpParameter)
{
SOCKET m_ClientSocket;
sockaddr_in m_Client;
int ClientLen=sizeof(sockaddr_in);
//下面是开始的时候的错误,TNND 把握居然把accept放在循环外面了 大错了
//m_ClientSocket=accept(g_Socket,(SOCKADDR*)&m_Client,&ClientLen);
//char szRecvBuffer[1024];
while(1)
{
m_ClientSocket=accept(g_Socket,(SOCKADDR*)&m_Client,&ClientLen);
char szRecvBuffer[1024];
if(SOCKET_ERROR==recv(m_ClientSocket,szRecvBuffer,1024,0))break;
sprintf(szTempBuffer,"小王:%s",szRecvBuffer);
//PostMessage(DlgHwnd,WM_RECVDATA,0,(LPARAM)szTempBuffer);
//SendMessage(g_DialogHwnd,WM_RECVDATA,0,0);
PostMessage(g_DialogHwnd,WM_RECVDATA,0,0);
}

closesocket(m_ClientSocket);
}
最 郁闷的就事这里
开始把那个listen放到循环外面去了
代码如下 :

//==================================头文件============================================
//#include <windows.h>
#include<Winsock2.h>
#include<stdio.h>
#include <process.h>
#include "resource.h"

//==========================定义消息====================================================
#define WM_RECVDATA WM_USER+100
//===========================库文件=====================================================
#pragma comment(lib, "ws2_32.lib")
#pragma comment(lib, "mswsock.lib")

//=========================全局变量=====================================================
char g_szIpAdress[20];//定义IP地址 字符串型的
SOCKET g_Socket; //定义SOCKET对象
HWND g_DialogHwnd; //定义对话框句柄
char szTempBuffer[9999];

//=========================全局函数=====================================================
BOOL CALLBACK DialogFun(HWND, UINT,WPARAM, LPARAM);
void __cdecl ReceiveMessage(void*);//线程函数,用来接受消息的用来监听消息的 并显示消息与对话框上,TNND这里要用到多线程处理 麻烦
BOOL GetLocalIP();//取得本主机IP
BOOL SetDlgIpAndPort();//设置为对话框IP
DWORD InitSocketVersion();//协议协商
BOOL InitSocket(); //创建并绑定socket
BOOL OnSend(); //用来发送消息的

//======================================================================================
int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow)
{
MSG msg;
if(100==DialogBox(hinstance,"mydialog",NULL,(DLGPROC)DialogFun))
{
PostQuitMessage(WM_QUIT);
}
while (GetMessage(&msg, (HWND) NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
//WSACleanup();
return msg.wParam;
UNREFERENCED_PARAMETER(lpCmdLine);

}

//========================================================================================
BOOL CALLBACK DialogFun(HWND dlghwnd, UINT message,WPARAM wParam, LPARAM lParam)
{
switch(message)
{
case WM_PAINT:
return FALSE;
case WM_INITDIALOG :

{
/*
HDC hwndcolor=GetDC(dlghwnd);
SetBkColor(hwndcolor,RGB(125,125,125));
ReleaseDC(dlghwnd,hwndcolor);*/

g_DialogHwnd=dlghwnd;
InitSocketVersion();
GetLocalIP();
SetDlgIpAndPort();
InitSocket();
listen(g_Socket,5);
return FALSE;
}
case WM_RECVDATA: //使用接受到消息,并显示于对话框上
{
char str[9999];
GetDlgItemText(g_DialogHwnd,IDC_DISPLAYTEXT,str,9999);
wsprintf(str,"%s/r/n%s",str,szTempBuffer);
SetDlgItemText(g_DialogHwnd,IDC_DISPLAYTEXT,str);
SetDlgItemText(g_DialogHwnd,IDC_SENDTEXT,"");
SetFocus((HWND)IDC_SENDTEXT);
break;
}

case WM_COMMAND:
{
switch(LOWORD(wParam))
{
case IDOK:
{
//OnClose(dlghwnd);
if(MessageBox(g_DialogHwnd,"我想死你了","笨蛋",33)==1)
{
closesocket(g_Socket);
WSACleanup();
EndDialog(g_DialogHwnd,100);//定义100来确定退出对话框
//PostQuitMessage(0);
}
return TRUE;
}
case IDC_SET_PORTANDIP:
{

//创建新的线程来接受客户端的消息
_beginthread(ReceiveMessage,0,(void*)&g_DialogHwnd);
break;
}
case IDC_SEND:
{
OnSend();

break;
}
}

return FALSE;
}
return FALSE;
}
return FALSE;
}
//=======================================================================================

BOOL GetLocalIP()
{
char NameBuffer[250];//定义存放主机名字的缓冲区
if(SOCKET_ERROR==gethostname(NameBuffer,sizeof(NameBuffer)))
{
return FALSE;
}
hostent* IpAdress=gethostbyname(NameBuffer);//IpAdress存放网络字节的IP地址
if(NULL==inet_ntoa (*(struct in_addr *)*IpAdress->h_addr_list))
{
return FALSE;
}
//用g_szIpAdress来保存IP的地址
strcpy (g_szIpAdress,inet_ntoa (*(struct in_addr *)*IpAdress->h_addr_list));
return TRUE;
}
//=====================================================================================
BOOL SetDlgIpAndPort()
{
SetDlgItemText(g_DialogHwnd,IDC_IPADDRESS,g_szIpAdress);
SetDlgItemInt(g_DialogHwnd,IDC_PORT,5200,FALSE);
return 0;
}

DWORD InitSocketVersion()
{
WSADATA wsaData;
return WSAStartup( MAKEWORD( 2, 2 ), &wsaData );
}

//==========================================================================================
BOOL InitSocket()
{
g_Socket=socket(AF_INET,SOCK_STREAM,0);//创建数TCP方式的SOCKET
if(INVALID_SOCKET==g_Socket)//判断是否创建成功
{
MessageBox(g_DialogHwnd,"创建SOCKET失败","错误",MB_OK);
return FALSE;
}
//从对话框上取出端口
BOOL b_ensure;
int port;
port=GetDlgItemInt(g_DialogHwnd,IDC_PORT,&b_ensure,FALSE);
if(FALSE==b_ensure)
{
MessageBox(g_DialogHwnd,"取得端口失败","错误",MB_OK);
return FALSE;
}
//从对话框上取得IP地址
char HostAdress[20];
if(0==GetDlgItemText(g_DialogHwnd,IDC_IPADDRESS,HostAdress,sizeof(HostAdress)))
{
MessageBox(g_DialogHwnd,"取得IP失败","错误",MB_OK);
return FALSE;
}
//填充地址结构体
sockaddr_in addrSock;
addrSock.sin_family=AF_INET;
addrSock.sin_port=htons(port);
addrSock.sin_addr.S_un.S_addr=inet_addr(HostAdress);
//bind
if(SOCKET_ERROR==bind(g_Socket,(SOCKADDR*)&addrSock,sizeof(addrSock)))
{
closesocket(g_Socket);
MessageBox(g_DialogHwnd,"BIND失败","错误",MB_OK);
return FALSE;
}
return TRUE;
}
//=================================================================================
void __cdecl ReceiveMessage(void* lpParameter)
{
SOCKET m_ClientSocket;
sockaddr_in m_Client;
int ClientLen=sizeof(sockaddr_in);
//下面是开始的时候的错误,TNND 把握居然把accept放在循环外面了 大错了
//m_ClientSocket=accept(g_Socket,(SOCKADDR*)&m_Client,&ClientLen);
//char szRecvBuffer[1024];
while(1)
{
m_ClientSocket=accept(g_Socket,(SOCKADDR*)&m_Client,&ClientLen);
char szRecvBuffer[1024];
if(SOCKET_ERROR==recv(m_ClientSocket,szRecvBuffer,1024,0))break;
sprintf(szTempBuffer,"小王:%s",szRecvBuffer);
//PostMessage(DlgHwnd,WM_RECVDATA,0,(LPARAM)szTempBuffer);
//SendMessage(g_DialogHwnd,WM_RECVDATA,0,0);
PostMessage(g_DialogHwnd,WM_RECVDATA,0,0);
}

closesocket(m_ClientSocket);
}
//=================================================================================

BOOL OnSend()
{
SOCKET SocketClient;
SocketClient=socket(AF_INET,SOCK_STREAM,0);

char HostAdress[20];
if(0==GetDlgItemText(g_DialogHwnd,IDC_IPADDRESS,HostAdress,sizeof(HostAdress)))
{
MessageBox(g_DialogHwnd,"取得IP失败","错误",MB_OK);
return FALSE;
}
//用connect去连接服务器
//连接的服务器的地址
//socketService指定了服务器的地址,端口和地址家族
sockaddr_in clientService;
clientService.sin_addr.S_un.S_addr=inet_addr( HostAdress);
clientService.sin_family=AF_INET;
clientService.sin_port=htons(5200);

//用connect连接服务器
if (connect(SocketClient, (SOCKADDR*) &clientService, sizeof(clientService) ) == SOCKET_ERROR) {
WSACleanup();
return 0;
}
char strSend[1023];
GetDlgItemText(g_DialogHwnd,IDC_SENDTEXT,strSend,1023);
send(SocketClient,strSend,sizeof(strSend)+1,0);
closesocket(SocketClient);
return TRUE;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: