为什么我的程序不能接收数据(没有触发FD_READ和FD_CONNECT事件)-附SDK源码,在线等待

sunxiaofeng 2003-05-11 11:46:34
#include<windows.h>
#include"resource.h"
#define WM_SOCKET_NOTIFY (WM_USER+1)

HWND hwndDlgIn;
HINSTANCE hInst;
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
BOOL CALLBACK DlgProc(HWND,UINT,WPARAM,LPARAM);
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,
PSTR szCmdLine,int iCmdShow)
{ static TCHAR szAppName[]=TEXT("hellowin");
HWND hwnd;
WNDCLASS wndclass;
MSG msg;
wndclass.style=CS_HREDRAW|CS_VREDRAW;
wndclass.lpfnWndProc=WndProc;
wndclass.cbClsExtra=0;
wndclass.cbWndExtra=0;
wndclass.hInstance=hInstance;
wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.lpszMenuName=TEXT("MainMenu");//NULL;
wndclass.lpszClassName=szAppName;
if(!RegisterClass(&wndclass))
{
MessageBox(NULL,TEXT("This program requires Windows NT!"),
szAppName,MB_ICONERROR);
return 0;
}
hInst=hInstance;

////////////
hwnd=CreateWindow(szAppName,
TEXT("The Hello Program"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,//LoadMenu(hInstance,MAKEINTRESOURCE(IDR_MENU)),
hInstance,
NULL);
////////////
hwndDlgIn=CreateDialog(hInstance,TEXT("DlgIn"),hwnd,DlgProc);
ShowWindow(hwnd,iCmdShow);
ShowWindow(hwndDlgIn,SW_SHOW);
UpdateWindow(hwnd);
while(GetMessage(&msg,NULL,0,0))
{
if(hwndDlgIn==0||!IsDialogMessage(hwndDlgIn,&msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
HMENU hMenu;
switch(message)
{
case WM_SETFOCUS:
SetFocus(hwndDlgIn);
return 0;
case WM_COMMAND:
hMenu=GetMenu(hwnd);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd,message,wParam,lParam);
}
BOOL CALLBACK DlgProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
static HWND hwndEdit1,hwndEdit2;
static char szIPAddr[32]={"132.163.135.130"};
static SOCKET sock;
static struct sockaddr_in sa;
static TCHAR szOKLabel[32];
int iError,iSize;
unsigned long ulTime;
WORD wEvent,wError;
WSADATA WSAData;
switch(message)
{
case WM_INITDIALOG:
hwndEdit1=GetDlgItem(hwnd,IDC_EDIT1);
hwndEdit2=GetDlgItem(hwnd,IDC_EDIT2);
return TRUE;
case WM_COMMAND:

switch(LOWORD(wParam))
{

case IDOK:
if(iError=WSAStartup(MAKEWORD(2,0),&WSAData))
{
MessageBox(hwnd,"wasstartup error","",MB_OK);
return TRUE;
}
sock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(sock==INVALID_SOCKET)
{
MessageBox(hwnd,"sock create error","",MB_OK);
WSACleanup();
return TRUE;
}
MessageBox(hwnd,"socket created!","",MB_OK);
if(SOCKET_ERROR==WSAAsyncSelect(sock,hwnd,WM_SOCKET_NOTIFY,FD_CONNECT|FD_READ))
{
MessageBox(hwnd,"wsaaysncselect error","",MB_OK);
closesocket(sock);
WSACleanup();
return TRUE;
}
sa.sin_family=AF_INET;
sa.sin_port=htons(IPPORT_TIMESERVER);
sa.sin_addr.S_un.S_addr=inet_addr(szIPAddr);
connect(sock,(SOCKADDR *)&sa,sizeof(sa));
if(WSAEWOULDBLOCK!=(iError=WSAGetLastError()))
{
MessageBox(hwnd,"connect error","",MB_OK);
closesocket(sock);
WSACleanup();
return TRUE;
}
SetWindowText(hwndEdit1,szIPAddr);

return TRUE;
case WM_SOCKET_NOTIFY:
wEvent=WSAGETSELECTEVENT(lParam);
wError=WSAGETSELECTERROR(lParam);
switch(wEvent)
{
case FD_CONNECT:
MessageBox(hwnd,"","",MB_OK);
if(wError)
{
MessageBox(hwnd,"fdconnect error","",MB_OK);
closesocket(sock);
sock=0;
WSACleanup();
return TRUE;
}
recv(sock,(char*)&ulTime,4,MSG_PEEK);
MessageBox(hwnd,"waiting to receive...","",MB_OK);
return TRUE;
case FD_READ:
       MessageBox(hwnd,"","",MB_OK);
if(wError)
{
MessageBox(hwnd,"fd read error","",MB_OK);
closesocket(sock);
sock=0;
WSACleanup();
return TRUE;
}
iSize=recv(sock,(char*)&ulTime,4,0);
ulTime=ntohl(ulTime);
MessageBox(hwnd,"Received current time","",MB_OK);
SetWindowText(hwndEdit2,(char *)ulTime);
return TRUE;
}

case IDCANCEL:
DestroyWindow(hwndDlgIn);
hwndDlgIn=NULL;

}
return TRUE;
case WM_CLOSE:
DestroyWindow(hwndDlgIn);
hwndDlgIn=NULL;
closesocket(sock);
sock=0;
WSACleanup();
return TRUE;
}

return FALSE;
}
为什么上面的代码不能触发WM_SOCKET_NOTIFY消息,后面的事件为什么不能发生??
请各位指教
...全文
136 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
sunxiaofeng 2003-05-16
  • 打赏
  • 举报
回复
太谢谢猪哥了:)
我试试,不行还请再提点小弟
sunxiaofeng 2003-05-14
  • 打赏
  • 举报
回复
谢谢,麻烦你了

Ws2_32我已经连上了,可是我调用winsock2。h就会有60多个错误,象这种
c:\program files\microsoft visual studio\vc98\include\winsock2.h(99) : error C2011: 'fd_set' : 'struct' type redefinition
c:\program files\microsoft visual studio\vc98\include\winsock2.h(134) : warning C4005: 'FD_SET' : macro redefinition
c:\program files\microsoft visual studio\vc98\include\winsock.h(83) : see previous definition of 'FD_SET'
solar 2003-05-14
  • 打赏
  • 举报
回复

#include <Winsock2.h>

连接 Ws2_32.lib

sunxiaofeng 2003-05-14
  • 打赏
  • 举报
回复
谢谢,为什么不行啊,
F:\vc\net1\net1.cpp(135) : error C2065: 'WSASocket' : undeclared identifier
F:\vc\net1\net1.cpp(135) : error C2065: 'WSA_FLAG_OVERLAPPED' : undeclared identifier
这是为什么??千万指教,我都被它郁闷了好几天了:(
pzh508 2003-05-14
  • 打赏
  • 举报
回复
而且使用sock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);没有错误,不改用WSASocket函数一样可以的
pzh508 2003-05-14
  • 打赏
  • 举报
回复
你怎么将case WM_SOCKET_NOTIFY消息处理放到case WM_COMMAND里面去了?WM_SOCKET_NOTIFY消息是你自己定义的消息,应该单独出来,它不属于WM_COMMAND消息
solar 2003-05-14
  • 打赏
  • 举报
回复
#define WIN32_LEAN_AND_MEAN

#include <windows.h>
#include <Winsock2.h>
solar 2003-05-13
  • 打赏
  • 举报
回复
sock=WSASocket(PF_INET,SOCK_STREAM,0,NULL,0,WSA_FLAG_OVERLAPPED);
^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^

18,355

社区成员

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

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