我是C89的新手,并试图进行一些套接字编程:
void get(char *url) {
struct addrinfo *result;
char *hostname;
int error;
hostname = getHostname(url);
error = getaddrinfo(hostname, NULL, NULL, &result);
}
我正在开发Windows。如果我使用这些包含语句,Visual Studio会抱怨没有这样的文件:
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
我该怎么办?这是否意味着我将无法移植到Linux?
答案 0 :(得分:6)
在Windows上,而不是您提到的包含,以下内容应该足够了:
#include <winsock2.h>
#include <windows.h>
您还必须链接到ws2_32.lib
。这样做有点难看,但对于VC ++,你可以通过以下方式完成:#pragma comment(lib, "ws2_32.lib")
Winsock和POSIX之间的其他一些差异包括:
在使用任何套接字功能之前,您必须先致电WSAStartup()
。
close()
现在称为closesocket()
。
不是将套接字作为int
传递,而是有一个等于指针大小的typedef SOCKET
。尽管Microsoft有一个名为-1
的宏来隐藏此内容,但您仍然可以使用INVALID_SOCKET
与fcntl()
进行比较。
对于设置非阻止标记的内容,您将使用ioctlsocket()
代替send()
。
您必须使用recv()
和write()
代替read()
和#ifdef
。
如果你开始为Winsock编码,你是否会失去使用Linux代码的可移植性......如果你不小心,那么是的。但您可以编写代码,尝试使用#ifdef _WINDOWS
/* Headers for Windows */
#include <winsock2.h>
#include <windows.h>
#else
/* Headers for POSIX */
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
/* Mimic some of the Windows functions and types with the
* POSIX ones. This is just an illustrative example; maybe
* it'd be more elegant to do it some other way, like with
* a proper abstraction for the non-portable parts. */
typedef int SOCKET;
#define INVALID_SOCKET ((SOCKET)-1)
/* OK, "inline" is a C99 feature, not C89, but you get the idea... */
static inline int closesocket(int fd) { return close(fd); }
#endif
s ..
例如:
{{1}}
然后,一旦你做了这样的事情,就可以使用适当的这些包装器对两个操作系统中出现的函数进行编码。