首页
社区
课程
招聘
极其郁闷的话题
发表于: 2010-5-8 17:45 6028

极其郁闷的话题

2010-5-8 17:45
6028
MFC基于对话框的应用程序,用到WSASocket创建套接字,无论#include <winsock2.h>放在哪里都报错,要么一大堆类型未定义,要么WINDOWS.H already included.  MFC apps must not #include <windows.h>。由于逃不过这两种情况 我写不出个能通过编译的程序 我并没有手动添加#include<windows.h>  关键在于#include <winsock2.h>的位置

请教#include <winsock2.h>最具体放在哪里?有如下位置:
工程名.cpp
工程名Dlg.cpp
StdAfx.cpp
工程名.h
工程名Dlg.h
StdAfx.h

越具体越好!

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 120
活跃值: (55)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
补充一下,我没有为对话框添加WOSA支持,如果勾选了该选项则会在StdAfx头文件后部自动加上#include <afxsock.h>并且在C工程名App::InitInstance()里自动添加
if (!AfxSocketInit())
{
AfxMessageBox(IDP_SOCKETS_INIT_FAILED);
return FALSE;
}

当然无论添加支持与否都无法通过编译
2010-5-8 17:57
0
雪    币: 291
活跃值: (164)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
在你的Cpp文件开头加

#include "winsock2.h"

在程序启动的位置使用

WSAStartup来启动网络支持

连接时,你要把库wsock32.lib加上
2010-5-8 18:02
0
雪    币: 120
活跃值: (55)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
相关代码如下,工程名为Chat,用WSA系列异步套接字只能用winsock2.h
BOOL CChatDlg::InitSocket()
{
m_socket=WSASocket(AF_INET,SOCK_DGRAM,0,NULL,0,0);
if(INVALID_SOCKET==m_socket)
{
        MessageBox("创建套接字失败");
        return FALSE;
}
SOCKADDR_IN addrSock;
addrSock.sin_addr.S_un .s_addr=htonl(INADDR_ANY);
addrSock.sin_family=AF_INET;
addrSock.sin_port=htons(6000);
if(SOCKET_ERROR==bind(m_sockt,(SOCKADDR*)&addrSock,sizeof(SOCKADDR)))
{
        MessageBox("绑定失败");
return FALSE;
}
if(SOCKET_ERROR==WSAAsyncSelect(m_socket,m_hWnd,UM_SOCK,FD_READ))
{
        MessageBox("注册网络读取事件失败");
        return FALSE;
}
return TRUE;
}

#include <winsock2.h>放在StdAfx前部报错Windows重包含,放在StdAfx后部报错如下

E:\VS\Workspaces\Chat\ChatDlg.cpp(180) : error C2039: 'S_un' : is not a member of '__unnamed'
        e:\vs\vc98\include\winsock2.h(311) : see declaration of '__unnamed'
E:\VS\Workspaces\Chat\ChatDlg.cpp(180) : error C2228: left of '.S_addr' must have class/struct/union type
E:\VS\Workspaces\Chat\ChatDlg.cpp(183) : error C2065: 'm_sockt' : undeclared identifier
E:\VS\Workspaces\Chat\ChatDlg.cpp(188) : error C2065: 'UM_SOCK' : undeclared identifier
2010-5-8 18:24
0
雪    币: 120
活跃值: (55)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
三楼的方法刚试了下——写过WSAStartup也连接了库文件,依然报1楼或4楼的错误
2010-5-8 18:39
0
雪    币: 291
活跃值: (164)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
S_un 什么东东?
addrSock.sin_addr.s_addr=htonl(INADDR_ANY);
2010-5-8 20:47
0
雪    币: 120
活跃值: (55)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
回6楼,S_un是联合体的一个域,不用也可以,但是问题仍没有解决,自己顶
我顶,努力中
2010-5-8 21:02
0
雪    币: 120
活跃值: (55)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
8
看来书中的东西错的很厉害。S_un是in_addr下的一个联合体
struct in_addr {
        union {
                struct { u_char s_b1,s_b2,s_b3,s_b4; } S_un_b;
                struct { u_short s_w1,s_w2; } S_un_w;
                u_long S_addr;
        } S_un;
}
结贴结贴
2010-5-8 21:54
0
雪    币: 97
活跃值: (43)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
9
我认为放在
StdAfx.h
我编写的Sock程序就是这么做的。好处是:在MFC中所有的其他.cpp都需要包含StdAfx.h一下,否则编译出错。那么一些系统的头文件在StdAfx.h中包含,就会让其他一些源文件不需用药重新包含了。这是自己理解的,仅供参考
2010-5-9 16:32
0
雪    币: 120
活跃值: (55)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
10
结贴了,我终于试出来了,只能放在StdAfx.h中#include <afxwin.h> 语句以后的任意位置
2010-5-10 10:21
0
游客
登录 | 注册 方可回帖
返回
//