0

根据 MSDN(VS2012 版本),sockaddr_in定义在winsock2.h. 没有任何例外(类似于我们在 Windows Phone 和一些 API 调用中看到的情况)。然而,当我尝试编译一个使用sockaddr_in和包含的文件时winsock2.h,我得到一个编译错误(如下)。

请注意,我没有收到winsock2.h not found错误(或类似错误)。另请注意,相同的代码可以在 Windows Phone 8 上编译。

WinRT 需要包含哪些内容?

        cl /Fotmp32dll\bss_conn.obj  -Iinc32 -Itmp32dll -DOPENSSL_THREADS  -W3 -
Gs0 -GF -Gy -nologo -DOPENSSL_SYSNAME_WINRT -DWIN32_LEAN_AND_MEAN -DL_ENDIAN -D_
CRT_SECURE_NO_DEPRECATE -I\usr\local\ssl\fips-2.0/include /nologo /D NDEBUG /D _
USRDLL /D _WINDLL /D WINAPI_FAMILY=WINAPI_PARTITION_APP /FI SDKDDKVer.h /FI wina
pifamily.h -DOPENSSL_NO_RC5 -DOPENSSL_NO_MD2 -DOPENSSL_NO_KRB5 -DOPENSSL_NO_ENGI
NE -DOPENSSL_NO_HW -DOPENSSL_FIPS -DOPENSSL_NO_JPAKE -DOPENSSL_NO_STATIC_ENGINE
/Zi /Fdtmp32dll/lib  -DOPENSSL_BUILD_SHLIBCRYPTO -c .\crypto\bio\bss_conn.c
bss_conn.c
.\crypto\bio\bss_conn.c(95) : error C2079: 'them' uses undefined struct 'sockadd
r_in'
.\crypto\bio\bss_conn.c(207) : error C2224: left of '.sin_family' must have stru
ct/union type
.\crypto\bio\bss_conn.c(207) : error C2065: 'AF_INET' : undeclared identifier
.\crypto\bio\bss_conn.c(208) : error C2224: left of '.sin_port' must have struct
/union type
.\crypto\bio\bss_conn.c(208) : warning C4013: 'htons' undefined; assuming extern
 returning int
.\crypto\bio\bss_conn.c(214) : error C2224: left of '.sin_addr' must have struct
/union type
.\crypto\bio\bss_conn.c(214) : warning C4013: 'htonl' undefined; assuming extern
 returning int
.\crypto\bio\bss_conn.c(217) : warning C4013: 'socket' undefined; assuming exter
n returning int
.\crypto\bio\bss_conn.c(217) : error C2065: 'AF_INET' : undeclared identifier
.\crypto\bio\bss_conn.c(217) : error C2065: 'SOCK_STREAM' : undeclared identifie
r
.\crypto\bio\bss_conn.c(217) : error C2065: 'IPPROTO_TCP' : undeclared identifie
r
.\crypto\bio\bss_conn.c(218) : error C2065: 'INVALID_SOCKET' : undeclared identi
fier
.\crypto\bio\bss_conn.c(220) : warning C4013: 'WSAGetLastError' undefined; assum
ing extern returning int
.\crypto\bio\bss_conn.c(260) : warning C4013: 'connect' undefined; assuming exte
rn returning int
.\crypto\bio\bss_conn.c(366) : error C2065: 'INVALID_SOCKET' : undeclared identi
fier
.\crypto\bio\bss_conn.c(379) : error C2065: 'INVALID_SOCKET' : undeclared identi
fier
.\crypto\bio\bss_conn.c(383) : warning C4013: 'shutdown' undefined; assuming ext
ern returning int
.\crypto\bio\bss_conn.c(384) : warning C4013: 'closesocket' undefined; assuming
extern returning int
.\crypto\bio\bss_conn.c(385) : error C2065: 'INVALID_SOCKET' : undeclared identi
fier
.\crypto\bio\bss_conn.c(422) : warning C4013: 'WSASetLastError' undefined; assum
ing extern returning int
.\crypto\bio\bss_conn.c(423) : warning C4013: 'recv' undefined; assuming extern
returning int
.\crypto\bio\bss_conn.c(447) : warning C4013: 'send' undefined; assuming extern
returning int
NMAKE : fatal error U1077: '"C:\Program Files (x86)\Microsoft Visual Studio 11.0
\VC\bin\x86_ARM\cl.EXE"' : return code '0x2'
Stop.
4

3 回答 3

3

sockaddr_in 的定义在文件 winsock2.h 中。在我的情况下,我得到了编译器错误“错误C2065:'sockaddr_in':未声明的标识符”,所以我打开文件winsock2.h查看sockaddr_in的定义,然后我找到了原因。

/*
 * Socket address, internet style.
 */
struct sockaddr_in {
        short   sin_family;
        u_short sin_port;
        struct  in_addr sin_addr;
        char    sin_zero[8];
};

上面的代码是 sockaddr_in 的定义。我以错误的方式定义我的变量:

sockaddr_in sin;

正确的方法是:

struct sockaddr_in sin;
于 2019-07-16T06:43:52.357 回答
1

请注意,从 Visual Studio 2013 Update 4 开始,winsock 可用于 Windows 应用商店应用程序。(这不适用于原始问题,但我添加这个以防其他人将来发现这个问题)。

于 2015-05-26T01:57:38.550 回答
0

那是链接器错误,而不是编译器错误。

.h 文件不参与链接过程。您需要包含一些包含该文件的 .lib 文件。

// 需要与 Ws2_32.lib、Mwsock.lib 和 Advapi32.lib 链接

http://msdn.microsoft.com/en-us/library/windows/desktop/ms737591(v=vs.85).aspx

编辑:哎呀,是的,它是编译器。不过,请查看我链接到的源代码

于 2013-08-08T08:44:17.407 回答