winsock 错误多的真爽啊

Windows平台下用C++做网络开发很多时候都会同时包含这两个头文件,如若顺序不当(windows.h先于winsock2.h)就会出现很多莫名其妙的错误。诸如:

c:\program files (x86)\microsoft sdks\windows\v7.0a\include\ws2def.h(91): warning C4005: “AF_IPX”: 宏重定义
1>          c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock.h(460) : 参见“AF_IPX”的前一个定义
1>c:\program files (x86)\microsoft sdks\windows\v7.0a\include\ws2def.h(131): warning C4005: “AF_MAX”: 宏重定义
1>          c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock.h(479) : 参见“AF_MAX”的前一个定义
1>c:\program files (x86)\microsoft sdks\windows\v7.0a\include\ws2def.h(168): warning C4005: “SO_DONTLINGER”: 宏重定义
1>          c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock.h(402) : 参见“SO_DONTLINGER”的前一个定义
1>c:\program files (x86)\microsoft sdks\windows\v7.0a\include\ws2def.h(212): error C2011: “sockaddr”:“struct”类型重定义
1>          c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock.h(485) : 参见“sockaddr”的声明
1>c:\program files (x86)\microsoft sdks\windows\v7.0a\include\ws2def.h(390): error C2059: 语法错误:“常量”
1>c:\program files (x86)\microsoft sdks\windows\v7.0a\include\ws2def.h(390): error C3805: “常量”: 意外标记,应输入“}”或者“,”
1>c:\program files (x86)\microsoft sdks\windows\v7.0a\include\ws2def.h(524): warning C4005: “IN_CLASSA”: 宏重定义
1>          c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock.h(287) : 参见“IN_CLASSA”的前一个定义
1>c:\program files (x86)\microsoft sdks\windows\v7.0a\include\ws2def.h(530): warning C4005: “IN_CLASSB”: 宏重定义
1>          c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock.h(293) : 参见“IN_CLASSB”的前一个定义
1>c:\program files (x86)\microsoft sdks\windows\v7.0a\include\ws2def.h(536): warning C4005: “IN_CLASSC”: 宏重定义
1>          c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock.h(299) : 参见“IN_CLASSC”的前一个定义
1>c:\program files (x86)\microsoft sdks\windows\v7.0a\include\ws2def.h(547): warning C4005: “INADDR_ANY”: 宏重定义
1>          c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock.h(304) : 参见“INADDR_ANY”的前一个定义
1>c:\program files (x86)\microsoft sdks\windows\v7.0a\include\ws2def.h(549): warning C4005: “INADDR_BROADCAST”: 宏重定义
1>          c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock.h(306) : 参见“INADDR_BROADCAST”的前一个定义
1>c:\program files (x86)\microsoft sdks\windows\v7.0a\include\ws2def.h(583): error C2011: “sockaddr_in”:“struct”类型重定义
1>          c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock.h(312) : 参见“sockaddr_in”的声明
1>c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock2.h(132): error C2011: “fd_set”:“struct”类型重定义
1>          c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock.h(68) : 参见“fd_set”的声明
1>c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock2.h(167): warning C4005: “FD_SET”: 宏重定义
1>          c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock.h(102) : 参见“FD_SET”的前一个定义
1>c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock2.h(176): error C2011: “timeval”:“struct”类型重定义
1>          c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock.h(111) : 参见“timeval”的声明
1>c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock2.h(232): error C2011: “hostent”:“struct”类型重定义
1>          c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock.h(167) : 参见“hostent”的声明
1>c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock2.h(245): error C2011: “netent”:“struct”类型重定义
1>          c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock.h(180) : 参见“netent”的声明
1>c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock2.h(252): error C2011: “servent”:“struct”类型重定义
1>          c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock.h(187) : 参见“servent”的声明
1>c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock2.h(264): error C2011: “protoent”:“struct”类型重定义
1>          c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock.h(199) : 参见“protoent”的声明
1>c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock2.h(360): error C2011: “WSAData”:“struct”类型重定义
1>          c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock.h(322) : 参见“WSAData”的声明
1>c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock2.h(458): error C2011: “sockproto”:“struct”类型重定义
1>          c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock.h(494) : 参见“sockproto”的声明
1>c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock2.h(500): error C2011: “linger”:“struct”类型重定义
1>          c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock.h(531) : 参见“linger”的声明
1>c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock2.h(513): warning C4005: “SOMAXCONN”: 宏重定义
1>          c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock.h(544) : 参见“SOMAXCONN”的前一个定义
1>c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock2.h(542): warning C4005: “FD_READ”: 宏重定义
1>          c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock.h(562) : 参见“FD_READ”的前一个定义
1>c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock2.h(545): warning C4005: “FD_WRITE”: 宏重定义
1>          c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock.h(563) : 参见“FD_WRITE”的前一个定义
1>c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock2.h(548): warning C4005: “FD_OOB”: 宏重定义
1>          c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock.h(564) : 参见“FD_OOB”的前一个定义
1>c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock2.h(551): warning C4005: “FD_ACCEPT”: 宏重定义
1>          c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock.h(565) : 参见“FD_ACCEPT”的前一个定义
1>c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock2.h(554): warning C4005: “FD_CONNECT”: 宏重定义
1>          c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock.h(566) : 参见“FD_CONNECT”的前一个定义
1>c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock2.h(557): warning C4005: “FD_CLOSE”: 宏重定义
1>          c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock.h(567) : 参见“FD_CLOSE”的前一个定义
1>c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock2.h(1578): error C2375: “accept”: 重定义;不同的链接
1>          c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock.h(742) : 参见“accept”的声明
1>c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock2.h(1600): error C2375: “bind”: 重定义;不同的链接
1>          c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock.h(747) : 参见“bind”的声明
1>c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock2.h(1619): error C2375: “closesocket”: 重定义;不同的链接
1>          c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock.h(752) : 参见“closesocket”的声明
1>c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock2.h(1638): error C2375: “connect”: 重定义;不同的链接
1>          c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock.h(754) : 参见“connect”的声明
1>c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock2.h(1659): error C2375: “ioctlsocket”: 重定义;不同的链接
1>          c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock.h(759) : 参见“ioctlsocket”的声明
1>c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock2.h(1680): error C2375: “getpeername”: 重定义;不同的链接
1>          c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock.h(764) : 参见“getpeername”的声明
1>c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock2.h(1701): error C2375: “getsockname”: 重定义;不同的链接
1>          c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock.h(769) : 参见“getsockname”的声明
1>c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock2.h(1724): error C2375: “getsockopt”: 重定义;不同的链接
1>          c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock.h(774) : 参见“getsockopt”的声明
1>c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock2.h(1745): error C2375: “htonl”: 重定义;不同的链接
1>          c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock.h(781) : 参见“htonl”的声明
1>c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock2.h(1762): error C2375: “htons”: 重定义;不同的链接
1>          c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock.h(783) : 参见“htons”的声明
1>c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock2.h(1780): error C2375: “inet_addr”: 重定义;不同的链接
1>          c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock.h(785) : 参见“inet_addr”的声明
1>c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock2.h(1797): error C2375: “inet_ntoa”: 重定义;不同的链接
1>          c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock.h(787) : 参见“inet_ntoa”的声明
1>c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock2.h(1815): error C2375: “listen”: 重定义;不同的链接
1>          c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock.h(789) : 参见“listen”的声明
1>c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock2.h(1833): error C2375: “ntohl”: 重定义;不同的链接
1>          c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock.h(793) : 参见“ntohl”的声明
1>c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock2.h(1850): error C2375: “ntohs”: 重定义;不同的链接
1>          c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock.h(795) : 参见“ntohs”的声明
1>c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock2.h(1870): error C2375: “recv”: 重定义;不同的链接
1>          c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock.h(797) : 参见“recv”的声明
1>c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock2.h(1895): error C2375: “recvfrom”: 重定义;不同的链接
1>          c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock.h(803) : 参见“recvfrom”的声明
1>c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock2.h(1921): error C2375: “select”: 重定义;不同的链接
1>          c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock.h(811) : 参见“select”的声明
1>c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock2.h(1945): error C2375: “send”: 重定义;不同的链接
1>          c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock.h(818) : 参见“send”的声明
1>c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock2.h(1970): error C2375: “sendto”: 重定义;不同的链接
1>          c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock.h(824) : 参见“sendto”的声明
1>c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock2.h(1996): error C2375: “setsockopt”: 重定义;不同的链接
1>          c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock.h(832) : 参见“setsockopt”的声明
1>c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock2.h(2018): error C2375: “shutdown”: 重定义;不同的链接
1>          c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock.h(839) : 参见“shutdown”的声明
1>c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock2.h(2039): error C2375: “socket”: 重定义;不同的链接
1>          c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock.h(843) : 参见“socket”的声明
1>c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock2.h(2063): error C2375: “gethostbyaddr”: 重定义;不同的链接
1>          c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock.h(850) : 参见“gethostbyaddr”的声明
1>c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock2.h(2083): error C2375: “gethostbyname”: 重定义;不同的链接
1>          c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock.h(855) : 参见“gethostbyname”的声明
1>c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock2.h(2101): error C2375: “gethostname”: 重定义;不同的链接
1>          c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock.h(857) : 参见“gethostname”的声明
1>c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock2.h(2121): error C2375: “getservbyport”: 重定义;不同的链接
1>          c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock.h(861) : 参见“getservbyport”的声明
1>c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock2.h(2141): error C2375: “getservbyname”: 重定义;不同的链接
1>          c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock.h(865) : 参见“getservbyname”的声明
1>c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock2.h(2160): error C2375: “getprotobynumber”: 重定义;不同的链接
1>          c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock.h(869) : 参见“getprotobynumber”的声明
1>c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock2.h(2178): error C2375: “getprotobyname”: 重定义;不同的链接
1>          c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock.h(871) : 参见“getprotobyname”的声明
1>c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock2.h(2200): error C2375: “WSAStartup”: 重定义;不同的链接
1>          c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock.h(875) : 参见“WSAStartup”的声明
1>c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock2.h(2219): error C2375: “WSACleanup”: 重定义;不同的链接
1>          c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock.h(879) : 参见“WSACleanup”的声明
1>c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock2.h(2236): error C2375: “WSASetLastError”: 重定义;不同的链接
1>          c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock.h(881) : 参见“WSASetLastError”的声明
1>c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock2.h(2253): error C2375: “WSAGetLastError”: 重定义;不同的链接
1>          c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock.h(883) : 参见“WSAGetLastError”的声明
1>c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock2.h(2270): error C2375: “WSAIsBlocking”: 重定义;不同的链接
1>          c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock.h(885) : 参见“WSAIsBlocking”的声明
1>c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock2.h(2287): error C2375: “WSAUnhookBlockingHook”: 重定义;不同的链接
1>          c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock.h(887) : 参见“WSAUnhookBlockingHook”的声明
1>c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock2.h(2304): error C2375: “WSASetBlockingHook”: 重定义;不同的链接
1>          c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock.h(889) : 参见“WSASetBlockingHook”的声明
1>c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock2.h(2321): error C2375: “WSACancelBlockingCall”: 重定义;不同的链接
1>          c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock.h(891) : 参见“WSACancelBlockingCall”的声明
1>c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock2.h(2343): error C2375: “WSAAsyncGetServByName”: 重定义;不同的链接
1>          c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock.h(893) : 参见“WSAAsyncGetServByName”的声明
1>c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock2.h(2370): error C2375: “WSAAsyncGetServByPort”: 重定义;不同的链接
1>          c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock.h(901) : 参见“WSAAsyncGetServByPort”的声明
1>c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock2.h(2396): error C2375: “WSAAsyncGetProtoByName”: 重定义;不同的链接
1>          c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock.h(909) : 参见“WSAAsyncGetProtoByName”的声明
1>c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock2.h(2421): error C2375: “WSAAsyncGetProtoByNumber”: 重定义;不同的链接
1>          c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock.h(916) : 参见“WSAAsyncGetProtoByNumber”的声明
1>c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock2.h(2446): error C2375: “WSAAsyncGetHostByName”: 重定义;不同的链接
1>          c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock.h(923) : 参见“WSAAsyncGetHostByName”的声明
1>c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock2.h(2473): error C2375: “WSAAsyncGetHostByAddr”: 重定义;不同的链接
1>          c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock.h(930) : 参见“WSAAsyncGetHostByAddr”的声明
1>c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock2.h(2496): error C2375: “WSACancelAsyncRequest”: 重定义;不同的链接
1>          c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock.h(939) : 参见“WSACancelAsyncRequest”的声明
1>c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock2.h(2517): error C2375: “WSAAsyncSelect”: 重定义;不同的链接
1>          c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock.h(941) : 参见“WSAAsyncSelect”的声明
1>f:\代码\code练习册\clentceshi\clentceshi\client.cpp(8): error C2079: “wsaData”使用未定义的 struct“WSAData”
1>f:\代码\code练习册\clentceshi\clentceshi\client.cpp(12): error C2440: “初始化”: 无法从“SOCKET (__stdcall *)(int,int,int)”转换为“SOCKET”
1>          没有使该转换得以执行的上下文
1>f:\代码\code练习册\clentceshi\clentceshi\client.cpp(20): error C2079: “servAddr”使用未定义的 struct“sockaddr_in”
1>f:\代码\code练习册\clentceshi\clentceshi\client.cpp(21): error C2228: “.sin_family”的左边必须有类/结构/联合
1>          类型是“int”
1>f:\代码\code练习册\clentceshi\clentceshi\client.cpp(22): error C2228: “.sin_port”的左边必须有类/结构/联合
1>          类型是“int”
1>f:\代码\code练习册\clentceshi\clentceshi\client.cpp(22): error C3861: “htons”: 找不到标识符
1>f:\代码\code练习册\clentceshi\clentceshi\client.cpp(24): error C2228: “.sin_addr”的左边必须有类/结构/联合
1>          类型是“int”
1>f:\代码\code练习册\clentceshi\clentceshi\client.cpp(24): error C2228: “.S_un”的左边必须有类/结构/联合
1>f:\代码\code练习册\clentceshi\clentceshi\client.cpp(24): error C2228: “.S_addr”的左边必须有类/结构/联合
1>f:\代码\code练习册\clentceshi\clentceshi\client.cpp(24): error C3861: “inet_addr”: 找不到标识符
1>f:\代码\code练习册\clentceshi\clentceshi\client.cpp(25): error C2446: “==”: 没有从“int”到“int (__stdcall *)(SOCKET,const sockaddr *,int)”的转换
1>          从整型转换为指针类型要求 reinterpret_cast、C 样式转换或函数样式转换
1>f:\代码\code练习册\clentceshi\clentceshi\client.cpp(25): error C2040: “==”:“int (__stdcall *)(SOCKET,const sockaddr *,int)”与“int”的间接寻址级别不同
1>f:\代码\code练习册\clentceshi\clentceshi\client.cpp(33): error C2440: “初始化”: 无法从“int (__stdcall *)(SOCKET,char *,int,int)”转换为“int”
1>          没有使该转换得以执行的上下文


要了命了~~~~
一堆的错误委实不爽,但是只要将二者的包含顺序调换一下问题就会解决
事实上一直都用的是Winsock1的,还从来没有用过Winsock2,今天开始使用它,但是出现了一大堆的错误,都是那个C2011和C2375之类的错误。当时就想,是不是2和1发生了冲突了?但是我没有包含过1的头文件啊?!
后来一查,在Windows.h里面发现了这么一段代码:  气死我了
  1. #ifndef _MAC
  2. #include <winperf.h>
  3. #include <winsock.h>
  4. #endif
复制代码
死人了把。。。。下面这样做可以解决
  1. #define WIN32_LEAN_AND_MEAN 
  2. #include <Windows.h>
复制代码
#define WIN32_LEAN_AND_MEAN这条语句,它能够将上面的语句包含winsock.h的语句消减掉。

也可以这样
  1. #ifndef _WINSOCKAPI_           // 没有包含winsock.h
  2. #define _WINSOCKAPI_           // 避免再包含winsock.h
  3.      #ifndef _WINSOCK2API_      // 没有包含winsock2.h
  4.     #define _WINSOCK2API_      // 避免再包含winsock2.h
  5.          #include <winsock2.h>
  6.          #pragma comment(lib, "ws32_2.lib")
  7.     #endif
  8. #endif
复制代码
注意啊  如果先包含了windows.h  那么这条语句就废了。。。。

include语句最前面加上#include <winsock2.h>和#include<windows.h>,世界清静了。

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
WinsockWindows 操作系统提供的用于进行网络编程的 API,而 MFC 是基于 Win32 API 的一个 C++ 类库,用于快速开发 Windows 程序。在 MFC 中使用 Winsock 进行多线程编程,可以实现网络通信的并发处理。 下面是一个使用 MFC 和 Winsock 实现的简单的多线程网络程序的示例: ```cpp // MySocket.h class CMySocket : public CSocket { public: CMySocket(); virtual ~CMySocket(); void SetParent(CWnd* pParentWnd); void SetPort(UINT nPort); void SetIPAddress(LPCTSTR lpszIPAddress); protected: virtual void OnReceive(int nErrorCode); private: CWnd* m_pParentWnd; UINT m_nPort; CString m_strIPAddress; }; // MySocket.cpp CMySocket::CMySocket() { m_pParentWnd = NULL; m_nPort = 0; m_strIPAddress.Empty(); } CMySocket::~CMySocket() { } void CMySocket::SetParent(CWnd* pParentWnd) { m_pParentWnd = pParentWnd; } void CMySocket::SetPort(UINT nPort) { m_nPort = nPort; } void CMySocket::SetIPAddress(LPCTSTR lpszIPAddress) { m_strIPAddress = lpszIPAddress; } void CMySocket::OnReceive(int nErrorCode) { if (nErrorCode == 0) { char szBuffer[1024]; int nBytes = Receive(szBuffer, sizeof(szBuffer)); if (nBytes > 0) { // 处理接收到的数据 CString strData(szBuffer, nBytes); m_pParentWnd->SendMessage(WM_MY_SOCKET_RECEIVE, (WPARAM)this, (LPARAM)&strData); } } CSocket::OnReceive(nErrorCode); } // MyThread.h class CMyThread : public CWinThread { public: CMyThread(); virtual ~CMyThread(); void SetParent(CWnd* pParentWnd); void SetPort(UINT nPort); protected: virtual BOOL InitInstance(); virtual int ExitInstance(); private: CWnd* m_pParentWnd; UINT m_nPort; }; // MyThread.cpp CMyThread::CMyThread() { m_pParentWnd = NULL; m_nPort = 0; } CMyThread::~CMyThread() { } void CMyThread::SetParent(CWnd* pParentWnd) { m_pParentWnd = pParentWnd; } void CMyThread::SetPort(UINT nPort) { m_nPort = nPort; } BOOL CMyThread::InitInstance() { // 创建服务器端套接字 CMySocket socketServer; socketServer.SetParent(m_pParentWnd); socketServer.Create(m_nPort); socketServer.Listen(); while (TRUE) { // 等待客户端连接 CMySocket* pSocketClient = new CMySocket; pSocketClient->SetParent(m_pParentWnd); socketServer.Accept(*pSocketClient); // 创建客户端线程 CMyThread* pThreadClient = new CMyThread; pThreadClient->SetParent(m_pParentWnd); pThreadClient->SetPort(0); pThreadClient->m_bAutoDelete = TRUE; pThreadClient->CreateThread(); } return TRUE; } int CMyThread::ExitInstance() { return CWinThread::ExitInstance(); } // MyDialog.h class CMyDialog : public CDialog { public: CMyDialog(CWnd* pParent = NULL); virtual ~CMyDialog(); enum { IDD = IDD_MY_DIALOG }; protected: virtual void DoDataExchange(CDataExchange* pDX); virtual BOOL OnInitDialog(); afx_msg void OnBtnStart(); afx_msg void OnBtnStop(); afx_msg LRESULT OnSocketReceive(WPARAM wParam, LPARAM lParam); DECLARE_MESSAGE_MAP() private: CMyThread* m_pThreadServer; CList<CMySocket*, CMySocket*> m_listSocketClient; }; // MyDialog.cpp BEGIN_MESSAGE_MAP(CMyDialog, CDialog) ON_BN_CLICKED(IDC_BTN_START, &CMyDialog::OnBtnStart) ON_BN_CLICKED(IDC_BTN_STOP, &CMyDialog::OnBtnStop) ON_MESSAGE(WM_MY_SOCKET_RECEIVE, &CMyDialog::OnSocketReceive) END_MESSAGE_MAP() CMyDialog::CMyDialog(CWnd* pParent /*=NULL*/) : CDialog(CMyDialog::IDD, pParent) { m_pThreadServer = NULL; } CMyDialog::~CMyDialog() { } void CMyDialog::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); } BOOL CMyDialog::OnInitDialog() { CDialog::OnInitDialog(); return TRUE; } void CMyDialog::OnBtnStart() { // 创建服务器线程 m_pThreadServer = new CMyThread; m_pThreadServer->SetParent(this); m_pThreadServer->SetPort(12345); m_pThreadServer->m_bAutoDelete = TRUE; m_pThreadServer->CreateThread(); } void CMyDialog::OnBtnStop() { // 关闭服务器线程和所有客户端套接字 if (m_pThreadServer != NULL) { m_pThreadServer->PostThreadMessage(WM_QUIT, 0, 0); m_pThreadServer = NULL; } POSITION pos = m_listSocketClient.GetHeadPosition(); while (pos != NULL) { CMySocket* pSocket = m_listSocketClient.GetNext(pos); pSocket->Close(); delete pSocket; } m_listSocketClient.RemoveAll(); } LRESULT CMyDialog::OnSocketReceive(WPARAM wParam, LPARAM lParam) { // 处理客户端套接字的接收事件 CMySocket* pSocket = (CMySocket*)wParam; CString* pstrData = (CString*)lParam; // 发送数据到客户端 pSocket->Send(pstrData->GetBuffer(), pstrData->GetLength()); return 0; } ``` 在上面的示例中,`CMySocket` 类继承自 `CSocket`,重载了 `OnReceive` 方法,处理套接字的接收事件,将接收到的数据发送给主窗口。`CMyThread` 类继承自 `CWinThread`,重载了 `InitInstance` 方法,创建服务器端套接字,并循环接收客户端连接,每次接收到客户端连接时创建一个客户端线程。`CMyDialog` 类继承自 `CDialog`,包含了开始和停止按钮,点击开始按钮创建服务器线程,点击停止按钮关闭服务器线程和所有客户端套接字,同时处理客户端套接字的接收事件,将接收到的数据发送回客户端。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值