主题:聊天程序的问题
bind()函数似乎有问题,运行的时候老是这边提示,请大家帮忙看看!!
#include<windows.h>
#include<winsock.h>
#include<stdio.h>
#include"resource.h"
BOOL CALLBACK DlgPrc(HWND, UINT, WPARAM, LPARAM);
HWND hDlg;
HINSTANCE hInst;
TCHAR buf[40];
TCHAR buff[40];
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
MSG Message;
WNDCLASS wc;
wc.hIcon = LoadIcon(hInst,(LPCTSTR)IDI_ICON1);
hDlg=CreateDialog(hInst,(LPCTSTR)IDD_DIALOG1,NULL,(DLGPROC)DlgPrc);
ShowWindow(hDlg,SW_SHOWNORMAL);
while (GetMessage(&Message, 0, 0, 0))
{
if (!IsDialogMessage(hDlg,&Message))
{
TranslateMessage(&Message);
DispatchMessage(&Message);
}
}
return Message.wParam;
}
BOOL CALLBACK DlgPrc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static WORD wVersionRequested; //这个变量存放一个整数,该数为SOCKET的版本号
static WSADATA wsaData; //这是个指针,SOCKET的错误信息结构体存放在内存中,该指针指向它的首地址
static SOCKET server; //该变量存放一个句柄,为SOCKET类型,这个定义类似于 FILE *fp
static SOCKET client; //同上
static TCHAR sendbuf[40];
static sockaddr_in local;// sockaddr_in是一个结构体,该结构体存放地址信息,local是它的结构体变量
static sockaddr_in from;//客户端的地址信息结构体
int froml=sizeof(from);
local.sin_family=AF_INET;// sin_family是结构体sockaddr_in的成员变量,该变量存放连接类型
local.sin_port=htons(5000);//该变量存放应用程序的端口号
local.sin_addr.s_addr=htonl(INADDR_ANY);//该变量存放IP地址
wVersionRequested=MAKEWORD(2,2); // MAKEWORD()函数为取两个整数,第一个证书放在变量的低字节,第2个放在高字节
switch (message)
{
case WM_INITDIALOG:
if(WSAStartup(wVersionRequested,&wsaData)!=0)
{
MessageBox(hDlg,"初始化失败!","提示:",0);
return FALSE;
}
//创建一个连接SOCKET,并获得一个连接句柄,一般在初始化窗口的时候完成这一步
if(server=socket(AF_INET,SOCK_STREAM,0) ==SOCKET_ERROR)// soket(连接类型,传输方式,0),AF_INET表示连接到internet
{
MessageBox(hDlg,"创建失败!","提示:",0);// SOCK_STREAM表示以字节流方式传输
return FALSE;
}
//将本机的IP地址和端口写入SOCKET中,一般在初始化窗口的时候完成这一步
if(bind(server,(sockaddr*)&local,sizeof(local))==SOCKET_ERROR)// bind(服务器的SOCKET句柄, sockaddr_in结构体的地址,该结构的长度)
{
wsprintf(buff,TEXT("%d"),WSAGetLastError);
MessageBox(hDlg,"渴了吃西瓜","提示:",MB_OK);
return FALSE;
}
//监听客户端的连接,一般在初始化窗口的时候完成这一步
if(listen(server,10)!=0)// listen(服务器的SOCKET句柄,允许最大的客户连接数目)
{
MessageBox(hDlg,"监视失败!","提示:",0);
return FALSE;
}
//接受连接,从而创建一个会话SOCKET,并获得一个会话SOCKET句柄,在初始化窗口时完成这一步
if(client=accept(server,(sockaddr*)&from,&froml)!=0)
{
MessageBox(hDlg,"接受连接失败!","提示:",0);
return FALSE;
}
//接受消息recv(发送方的SOCKET句柄,要接受的字符存放区,存放区所存字符的长度,0),在WM_MESSAGE_REVED:中完成这一步
if(recv(client,sendbuf,strlen(sendbuf)+1,0)== SOCKET_ERROR)
{
return FALSE;
}
return 1;
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDOK:
if(hDlg)
{
GetWindowText(GetDlgItem(hDlg,IDC_EDIT2),sendbuf,
GetWindowTextLength(GetDlgItem(hDlg,IDC_EDIT2))+1);
SetWindowText(GetDlgItem(hDlg,IDC_EDIT1),sendbuf);
//发送消息send(接受方的SOCKET句柄,要发送的字符存放区,存放区所存字符的长度,0)
//在WM_CONMMAND:中完成这一步
if(send(client,sendbuf,strlen(sendbuf)+1,0)== SOCKET_ERROR)
{
return FALSE;
}
return 1;
}
break;
case IDCANCEL:
if(hDlg)
DestroyWindow(hDlg);
return 1;
break;
}
case WM_SETFOCUS:
return 1;
break;
case WM_CLOSE:
shutdown(server,0X02);
closesocket(server);
WSACleanup();
DestroyWindow(hDlg);
return 1;
break;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
break;
}
return 0;
}