用工具看了,确实 客户端和服务端已经连接但是服务端的 acccept这一句代码,却是无法执行(所谓无法执行就是,我设置了断点,却没有运行到这里,我怀疑,是否消息注册错了)
有人质疑, 为什么说 客户端和服务端连接了呢?我会在2楼提供我的客户端代码,大家看到就明白了
服务端代码,注意看 窗口处理函数代码#include <STDIO.H>
#include <winsock2.h>
#include<windows.h>#pragma comment(lib, "WS2_32") // 链接到WS2_32.lib
#define WM_SOKCET (WM_USER+100) //套接字消息//加载环境
class CInitWinSock
{
public:
CInitWinSock(BYTE minorVer = 2, BYTE majorVer = 2)
{
// 初始化WS2_32.dll
WSADATA wsaData;
WORD sockVersion = MAKEWORD(minorVer, majorVer);
if(::WSAStartup(sockVersion, &wsaData) != 0)
{
exit(0);
}
}
~CInitWinSock()
{
::WSACleanup();
}
};
CInitWinSock g_initsock; //全局对象
SOCKET g_listenSock; //监听套接字LRESULT WINAPI WinSunProc(HWND, UINT,WPARAM,LPARAM);
int main()
{
WNDCLASS win;
win.style=CS_HREDRAW | CS_VREDRAW ;//类型窗口的样式 风格 水平重画和垂直重画
win.lpfnWndProc=WinSunProc;//窗口过程函数(回调函数)函数指针
win.cbClsExtra=0; // 一般为0 附加内存空间
win.cbWndExtra=0; // 一般为0 窗口附加内存
win.hbrBackground=(HBRUSH)GetStockObject(0);//背景画刷句柄
win.hCursor=LoadCursor(NULL,IDC_CROSS); //光标句柄
win.hIcon=LoadIcon(NULL,IDI_ERROR); //窗口类的图标句柄
win.hInstance= NULL; //hInstance; //包含窗口过程的实例句柄
win.lpszClassName="11";//窗口类名
win.lpszMenuName=NULL;
/////////////////
////////////////////////////////////////////////////////////////////////////
//定义窗口类
RegisterClass(&win);//注册窗口类
HWND hwnd;
hwnd=CreateWindow("11","zhangyongfeng",WS_OVERLAPPEDWINDOW,
100,100,600,400,NULL,NULL,NULL,NULL); //创建窗口
//创建监听套接字
USHORT nPort = 9585; // 此服务器监听的端口号
// 创建监听套节字
g_listenSock = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_port = htons(nPort);
// sin.sin_addr.S_un.S_addr = INADDR_ANY;
sin.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
// 绑定套节字到本地机器
if(::bind(g_listenSock, (sockaddr*)&sin, sizeof(sin)) == SOCKET_ERROR)
{
printf(" Failed bind() \n");
return -1;
}
WSAAsyncSelect(g_listenSock,hwnd,WM_SOKCET,FD_CONNECT|FD_READ);
// 进入监听模式
::listen(g_listenSock, 5);
// UpdateWindow(hwnd);
// ShowWindow(hwnd, SW_SHOW);
MSG msg;
while(GetMessage(&msg, hwnd, 0,0))
{
DispatchMessage(&msg);
}
return 0;
}
LRESULT WINAPI WinSunProc(HWND hwnd, UINT msg,WPARAM wp,LPARAM lp)
{ SOCKET s=(SOCKET)wp; switch(msg)
{
case WM_SOKCET:
{
if(HIWORD(lp))
{
closesocket(s);
return -1;
}
switch(LOWORD(lp))
{
case FD_ACCEPT: //接受
{
SOCKET newSocket=accept(s,NULL,NULL);
WSAAsyncSelect(newSocket,hwnd,WM_SOKCET,FD_READ|FD_WRITE|FD_CLOSE);
break;
}
case FD_CLOSE:
{
closesocket(s);
break;
}
case FD_READ:
{
char buf[200];
ZeroMemory(buf,200);
int nRet=recv(s,buf,sizeof(buf),0);
printf("%s\n",buf);
break;
}
} //end 内部switch
} //end case
case WM_QUIT:
{
PostQuitMessage(0);
break;
}
} //end switch
return DefWindowProc(hwnd,msg,wp,lp);
}
解决方案 »
- WSAWaitForMultipleEvents使用疑问
- OpenGL 程序运行一段时间后出现资源异常
- Debug正常,Release后报错,This application has requested
- 关于控件事件不响应的问题
- 求救! MFC中有数组,连表类是吗? 急用!
- 键盘消息
- 请问做一个在DOS底下和WINDOWS底下一样功能的软件该怎么做啊????
- 关于CSocket接收问题!
- onTimer()想得到时间显示,得到错误提示,为什么?初涉VC,繁多指教(以60分相许)
- 怎样在 RICHEDIT 中的光标位置上添加文本?
- 现在学习MFC还有必要吗?
- DirectShow对工业CCD的操作,找不到视频设备怎么办?
为什么说 我看到了客户端和服务端连接呢?看while循环后有一句printf函数如果连接成功,则打印成功,否则打印失败!!1
我开启了客户端,当时服务端的accept没有被调用,是怎么回事啊?更是收不到任何数据呢?
不要说用getlasterror,根本进不了 case WM_SOKCET:
{
if(HIWORD(lp))
{
closesocket(s);
return -1;
无法进入啊客户端代码
//////////////////////////////////////////////////////////
// TCPClient.cpp文件
#include "common/InitSock.h"
#include <stdio.h>
CInitSock initSock; // 初始化Winsock库int main()
{
// 创建套节字
SOCKET s = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(s == INVALID_SOCKET)
{
printf(" Failed socket() \n");
return 0;
}
// 也可以在这里调用bind函数绑定一个本地地址
// 否则系统将会自动安排
// 填写远程地址信息
sockaddr_in servAddr;
servAddr.sin_family = AF_INET;
servAddr.sin_port = htons(9585);
// 注意,这里要填写服务器程序(TCPServer程序)所在机器的IP地址
// 如果你的计算机没有联网,直接使用127.0.0.1即可
servAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
while(::connect(s, (sockaddr*)&servAddr, sizeof(servAddr)) == -1)
{
Sleep(500);
printf(" Failed connect() \n");
continue;
} printf(" Success connect() \n"); char buf[100];
memset(buf,0,100); strcpy(buf,"hello");
for(int i=0; i<10;i++) {
send(s,buf,100,0);
Sleep(200);
}
ZeroMemory(buf,sizeof(buf));
recv(s,buf,sizeof(buf),0); printf("收到的数据为%s\n",buf);
// 关闭套节字
::closesocket(s);
return 0;
}
FD_ACCEPT ?