分享
 
 
 

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

王朝other·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

调试的时候范了点小错误

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;

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有