Linux,OSX和Windows上的基本TCP客户端【JAVA教程】

!
也想出现在这里? 联系我们
信息

Linux,OSX和Windows上的基本TCP客户端,第1张

概述Linux,OSX和Windows上的基本TCP客户端

我想制作一个在windows,linux和osx(最重要的)在C上工作的TCP客户端。我在SO上find的代码可能在linux上工作,但不在OSX上,反之亦然。 那么我需要什么来确保它在三个方面都能正常工作?

谢谢!

VisualStu@R_419_6901@中的windows GUI应用程序

如何获得调用父母的libc6符号(例如_int_malloc)与linux perf?

僵尸进程不能被杀死

如何确定一个内存繁重的CUDA应用程序的最大可能的线程和块?

在C中打印hex的前导零

假设你打算编写你的代码来使用BSD套接字API,你会发现大多数在linux上运行的TCP客户端代码可以在MacOS / X上很少修改或者不需要修改,反之亦然。

让代码在windows下工作也有点麻烦,因为所需要的#includes是不同的,并且有很多情况下windows的TCP堆栈(又名WinSock)的行为有点不同于TCP堆栈另外两个 *** 作系统的。 也就是说,windows确实支持大部分的BSD套接字API,并且有一些#ifdef-ing,你可以想出一个能在所有三个OS上正确编译和运行的程序。 当然,您需要在所有三个 *** 作系统上进行测试和调试。 从来没有假设只是因为某个 *** 作系统上的某些东西可以在任何地方工作。

根据您的程序的特定需求(和您的兴趣),遵循Duck的建议并找到一个已经为您完成上述工作的联网库是很有意义的; 但是如果你喜欢“自己动手”,那也是可行的。 写入BSD套接字API的一个好方法是:每当你找到一段代码,你必须针对不同的 *** 作系统写不同的代码片段,一起隐藏这个代码片段的实现(使用#ifdef,以便正确的代码在每个 *** 作系统下编译),以便程序的其余部分不必记住如何处理那个令人不快的细节了。 做足够多的时间,你将成为你自己的跨平台网络库的骄傲的维护者;)

我建议先让你的程序在linux和/或OS / X下工作,一旦你满意,然后移植到windows。 将网络代码移植到windows时,需要注意一些“疑难问题”:

在windows下,您可以#include windows.h或winsock2.h来获取所需的网络定义。 (如果你想要更新的WinSock2 API,你必须包含winsock2.h,并且总是在任何#include的windows.h之前执行它,否则你会得到错误的API版本…这是一个真正的马戏团)

在windows下,您必须先调用WSAStartup(),然后再执行任何网络连接(如果您忘记了,所有网络连接调用都会出错)

在MacOS / X和linux下,文件描述符和套接字在很大程度上是可以互换的(也就是说,你可以在STDIN_fileNO上选择()等)。 在windows下,他们不是。

在MacOS / X和linux下,您可以通过检查errno来找出呼叫失败的原因。 在windows下,您可以调用WSAGetLastError()。

在MacOS / X和linux下,使用close()销毁套接字。 在windows下,你可以用closesocket()来做到这一点。

在MacOS / X和linux下,您可以(如果您选择)在您的TCP套接字上调用read()和write()来分别接收/发送数据。 在windows下,这是行不通的,你只能调用send()和recv()。 (send()和recv()也可以在MacOS / X和linux下工作)

要在windows下将套接字设置为非阻塞模式,您必须调用ioctlsocket(fd,FIONBIO和&mode)。 在MacOS / X和linux下,您可以调用fcntl(fd,F_SETFL,flags)。

更多的乐趣windows网络陷阱可以在WinSock Lame列表中读取。

总结

以上是内存溢出为你收集整理的Linux,OSX和Windows上的基本TCP客户端全部内容,希望文章能够帮你解决Linux,OSX和Windows上的基本TCP客户端所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

© 版权声明
THE END
喜欢就支持一下吧
点赞185 分享
评论 抢沙发

请登录后发表评论

    请登录后查看评论内容