Windows RT中的sockaddr_in在哪里?

时间:2013-08-08 07:28:16

标签: sockets windows-runtime winsock windows-rt

根据MSDN(VS2012 version),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.

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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;

答案 2 :(得分:0)

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

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

//需要链接Ws2_32.lib,Mswsock.lib和Advapi32.lib

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

编辑:oops,是的,它是编译器。不过,请查看我链接到

的源代码