基于SELECT模型的服务器应用程序例子,求改错?

罗爱我 2016-05-25 09:39:48
// WSAAsyncSelect.cpp : 定义控制台应用程序的入口点。
//
f:\tcp\wsaasyncselect\wsaasyncselect\wsaasyncselect.cpp(18): error C2011: “_WSABUF”:“struct”类型重定义
1> c:\program files\microsoft sdks\windows\v7.0a\include\ws2def.h(631) : 参见“_WSABUF”的声明
1>f:\tcp\wsaasyncselect\wsaasyncselect\wsaasyncselect.cpp(39): error C2065: “SocketInfoList”: 未声明的标识符
1>f:\tcp\wsaasyncselect\wsaasyncselect\wsaasyncselect.cpp(40): error C2065: “SocketInfoList”: 未声明的标识符
1>f:\tcp\wsaasyncselect\wsaasyncselect\wsaasyncselect.cpp(44): error C2065: “SocketInfoList”: 未声明的标识符
1>f:\tcp\wsaasyncselect\wsaasyncselect\wsaasyncselect.cpp(59): error C2065: “WindowProc”: 未声明的标识符
1>





#include "stdafx.h"
#include <WINSOCK2.H>
// 用于管理输入输出流的头文件
#include <iostream>
#pragma comment(lib,"WS2_32.lib")
#define BUF_SIZE 64 // 缓冲区大小
#define MAXDATASIZE 100
typedef struct _SOCKET_INFORMATION{
CHAR Buffer[MAXDATASIZE];
WSABUF DataBuf;
SOCKET Socket;
_SOCKET_INFORMATION *Next;
}SOCKET_INFORMATION,* LPSOCKET_INFORMATION;

typedef struct _WSABUF{
u_long len;
char FAR * buf;
}WSABUF,FAR *LPWSABUF;


#define BACKLOG 10
#define MAXDATASIZE 100
#define WM_SOCKET (WM_USER +1)
SOCKET Accept;
LPSOCKET_INFORMATION SocketInfList;
char buf[MAXDATASIZE];
void CreateSocketInformation(SOCKET s)
{
LPSOCKET_INFORMATION SI;
if((SI=(LPSOCKET_INFORMATION) GlobalAlloc(GPTR,sizeof(SOCKET_INFORMATION)))==NULL)
{
printf("GlobalAlloc() failed with error %d\n",GetLastError());
return;
}
SI->Socket=s;
SI->Next=SocketInfoList;
SocketInfoList=SI;
}
LPSOCKET_INFORMATION GetSocketInformation(SOCKET s)
{
SOCKET_INFORMATION *SI=SocketInfoList;
while(SI)
{
if(SI->Socket==s)
return SI;
SI=SI->Next;
}
return NULL;
}
HWND MakeWorkerWindow(void)
{
WNDCLASSEX wndclass;
CHAR *ProviderClass ="AsyncSelect";
HWND Window;
wndclass.style=CS_HREDRAW |CS_VREDRAW;
wndclass.lpfnWndProc =(WNDPROC)WindowProc;
wndclass.cbClsExtra=0;
wndclass.cbWndExtra=0;
wndclass.hInstance=NULL;
wndclass.hIcon=LoadIcon(NULL,IDI_WARNING);
wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
wndclass.hbrBackground=(HBRUSH) GetStockObject(WHITE_BRUSH);
wndclass.lpszMenuName=ProviderClass;
if(RegisterClassEx(&wndclass)==0)
{
printf("RegisterClass() failed with error %d\n",GetLastError());
return NULL;
}






//创建接受消息的窗口
if((Window=CreateWindow(ProviderClass,"",WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,NULL,NULL))==NULL)
{
printf("CreateWindow() failed with error %d\n",GetLastError());
return NULL;
}
return Window;
}


//窗口
LRESULT CALLBACK WindowProc (HWND hwnd,

UINT uMsg,

WPARAM wParam,

LPARAM lParam)
{
LPSOCKET_INFORMATION SocketInfo;
if(uMsg==WM_SOCKET)
{
if(WSAGETSELECTERROR(lParam))
{
printf("Socket failed with error %d\n",WSAGETSELECTERROR(lParam));
}
else
{
switch(WSAGETSELECTEVENT(lParam))
{
case FD_ACCEPT:
if((Accept=accept(wParam,NULL,NULL))== INVALID_SOCKET)
{
printf("accept() failed with error %d\n",WSAGetLastError());
break;
}

CreateSocketInformation(Accept);
WSAAsyncSelect(Accept,hwnd,WM_SOCKET,FD_READ|FD_WRITE|FD_CLOSE);
break;
case FD_READ:
SocketInfo=GetSocketInformation(wParam);

int Rec=recv(SocketInfo->Socket,buf,MAXDATASIZE,0);
buf[Rec]='\0';
if(Rec>0)
{
printf("Received:%s",buf);
}
break;

}
}
return 0;

}
return DefWindowProc(hwnd,uMsg,wParam,lParam);
}


int _tmain(int argc, _TCHAR* argv[])
{
MSG msg;
DWORD Ret;
SOCKET sockfd;
struct sockaddr_in my_addr;
HWND Window;
//创建窗口
if((Window=MakeWorkerWindow()) == NULL)
return 0;
WSADATA ws;
WSAStartup(MAKEWORD(2,2),&ws);
sockfd=socket(AF_INET,SOCK_STREAM,0);
WSAAsyncSelect(sockfd,Window,WM_SOCKET,FD_ACCEPT);
my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(9990);
my_addr.sin_addr.s_addr = INADDR_ANY;


bind(sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr));
listen(sockfd,BACKLOG);
while(Ret=GetMessage(&msg,NULL,0,0))
{
if(Ret==-1)
{

printf("GetMessage() failed with error %d\n",GetLastError());
return 0;
}

TranslateMessage(&msg);
DispatchMessage(&msg);
}

return 0;
}

...全文
318 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
枫舞的季节 2016-05-26
  • 打赏
  • 举报
回复
包含顺序如下: #include <winsock2.h> #include <windows.h> 就能解决冲突问题。

6,850

社区成员

发帖
与我相关
我的任务
社区描述
Windows 2016/2012/2008/2003/2000/NT
社区管理员
  • Windows Server社区
  • qishine
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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