将 Winsock 移植到 Linux 套接字

发布于 2024-10-10 16:24:45 字数 355 浏览 5 评论 0原文

我有一个使用 Winsock 进行一些网络操作的程序,我们现在的要求之一是将我们的程序移植到 Linux。唯一阻止我们这样做的是 Winsock。

我的问题是:将其移植到 Linux 实现有多容易?

有什么我应该注意的陷阱吗?如果我只是包含适当的头文件,我必须确保处理什么样的事情?

感谢您的帮助!

我会发布代码,但不幸的是,由于法律原因我不能。 但是,我们的代码确实使用了以下内容:

WSAStartup(..)
WSACleanup(..)
Socket(..)
sendto(..)
recvfrom(..)
ioctlsocket(..)
setsocketopt(..)

I have a program that does some networking using Winsock, and one of our requirements right now is to port over our program to Linux. The only thing stopping us from doing this is Winsock.

My question is: How easy can I port this over to a Linux implementation?

Are there any pitfalls I should be aware of, and if I simply include the appropriate header files, what sort of things will I have to be sure to handle?

Thanks for any help!

I'd post code but I can't unfortunately due to legal reasons.
But, our code does use the following:

WSAStartup(..)
WSACleanup(..)
Socket(..)
sendto(..)
recvfrom(..)
ioctlsocket(..)
setsocketopt(..)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

情仇皆在手 2024-10-17 16:24:46

唯一使移植变得困难的调用是 WSA* 调用。

WSAStartup() ->;不
WSACleanup() -> nop

套接字/setsockopt -> socket/setsockopt

在 *nix 下,套接字默认是阻塞的,没有必要也不可能使用奇怪的 setsockopt 调用来摆弄它。

ioctlsocket ->; ioctl

在 *nix 下我们不太喜欢异步套接字,更喜欢使用 select() 系统调用。

----这个答案的其余部分似乎只适用于Win95兼容的winsock ----

不幸的是,由于Winsock中的原始socket()在某些情况下被破坏,您可能使用了WSASocket(),因此必须转换这些调用。

The only calls that make porting difficult are the WSA* calls.

WSAStartup() -> nop
WSACleanup() -> nop

Socket/setsockopt -> socket/setsockopt

Under *nix, sockets are blocking by default and it's not necessary or possible to use that weird setsockopt call to fiddle with it.

ioctlsocket -> ioctl

Under *nix we don't like asynchronous sockets much and prefer to use the select() system call.

---- Rest of this answer seems only to apply to Win95 compatible winsock ----

Unfortunately as the original socket() in Winsock was broken in some cases, you probably used WSASocket() and so have to convert those calls.

清引 2024-10-17 16:24:46

如果没有看到代码,很难说它有多容易。但是您应该能够将winsock 调用替换为sys/socket.h 中的类似函数。

Without seeing code, it's tough to say how easy it is. But you should be able to replace winsock calls to analogs in sys/socket.h.

遗失的美好 2024-10-17 16:24:45

这将取决于您是否使用任何 Windows 特定的网络功能,或者您是否只是使用大多数与 BSD 兼容的 API。

因此,如果您使用重叠的 I/O 和 I/O 完成端口以及 Winsock API 的其他高级部分,那么移植将非常困难,如果您只是使用 BSD 兼容的东西,那么移植应该很容易写一个薄的翻译层,甚至只是在 Windows 特定的 ifdef 中包含 Winsock 启动和关闭内容...

这可能会有所帮助:http://tangentsoft.net/wskfaq/articles/bsd-compatibility.html

It will depend if you use any windows specific networking functionality or if you're just using mostly the mostly BSD compatible API.

So, if you're using overlapped I/O and I/O completion ports and other advanced parts of the Winsock API then things will be very difficult to port and if you're just using the BSD compatible stuff then it should be easy to write a thin translation layer or even just have the winsock startup and shutdown stuff inside a windows specific ifdef...

This may help: http://tangentsoft.net/wskfaq/articles/bsd-compatibility.html

空名 2024-10-17 16:24:45

根据该功能列表,事情或多或少应该可以正常工作。在对 WSAStartupWSACleanup 的调用周围添加 #if _WIN32 (Linux 相当于不执行任何操作,套接字库会自动初始化)。

在设置套接字选项时,您可能还需要一些依赖于操作系统的代码,其中一些相同,一些不同,并且类型可能不同。

Based on that list of functions, things should more or less just work. Add #if _WIN32 around the calls to WSAStartup and WSACleanup (the linux equivalent is to not do anything, the sockets library is initialized automatically).

You also might need some OS-dependent code when setting socket options, some of them are the same, some aren't, and the types might be different.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文