我正在将一个通信库从Linux移植到Windows.我知道我的方法在很大程度上是什么.该库使用所有原始以太网级别帧进行所有通信.
我移植的库使用PF_PACKET族和struct sockaddr_ll.浏览MSDN winsock站点后,我还没有找到一个等效的系列/结构.我的方法应该在这里?
我有一些想法,但我不确定它们是否是好主意我可以使用PF_UNSPEC,未指定.我可以传递PF_PACKET表示的数字(它是一个无符号的短)我也可以在Windows中创建自己的sockadddr_ll结构.
这些想法对我来说都不好看,它们看起来就像是不太可能有效的黑客.
如果有人有任何建议,我将不胜感激.
我即将在C++中开发一些与套接字相关的东西,并且希望软件从一开始就尽可能在Windows和Linux之间移植(以后便携它很棘手.)
我看过不同的库,有一个来自alhem.net的 C++ ,当然还有boost :: asio.boost :: asio看起来非常有前景,但对于这么小的应用程序来说是一个非常大的依赖.
是否值得自己写这些东西或者我应该只使用图书馆?如果我自己做,那么主要的陷阱是什么?
如果使用CreateProcessWithLogonW或CreateProcessAsUserW创建进程,则使用我自己的程序或其他程序在调用时无法运行winsock。创建套接字时,它将返回此错误:
Run Code Online (Sandbox Code Playgroud)WSAEPROVIDERFAILEDINIT 10106服务提供商初始化失败。
Run Code Online (Sandbox Code Playgroud)The requested service provider could not be loaded or initialized.如果无法加载服务提供商的DLL(LoadLibrary失败)或提供商的WSPStartup或NSPStartup函数失败,则返回此错误
。
但是,WSAStartup似乎没有错误。只需使用WSASocket创建套接字即可返回此结果。
更新:
错误:
LoadUserProfile:错误代码2。找不到指定的文件
AdjustTokenPrivs:错误代码5。访问被拒绝
在winsock中查看异步地址解析似乎只有两个选项要么gethostbyname在单独的线程上使用阻塞,要么使用WSAAsyncGetHostByName.后者的设计是出于某种原因使用窗口消息,而不是重叠操作和完成端口/例程.
是否有任何版本的gethostbyname异步操作以与winsock API的其余部分类似的方式与重叠操作异步工作?
我正在试图弄清楚如何使用winsockets来将我的游戏变成局域网可玩的游戏.我已经阅读了一些winsockets文档,但我无法弄清楚客户端如何获得在LAN上创建的所有游戏.
它是否必须尝试"连接"到LAN上的每个IP,例如尝试连接到192.168.0.1,然后是192.168.0.2等?有没有更好的办法?
我目前有一个.NET程序启动与服务器的连接并启动另一个非托管可执行文件.本机进程应该接管相同的套接字(在子进程终止之前,连接不必关闭!)并开始通过它与服务器进行通信.
上述程序在Windows上运行,但是我更喜欢不涉及P/Invoke for .NET部分的解决方案.作为旁注,从父母到子进程的通信不是问题所以我可以轻松地在两者之间共享数据.
此外,一旦我开始使用本机进程中的套接字,我不再需要在.NET进程中使用它,并且.NET进程将在我使用非托管进程中的套接字之前终止,因此随之而来解决方案我需要知道如何处理.NET中的Socket对象,以便它的处理不会影响操作系统套接字及其可用性.
提前致谢!
如果我想从1个线程调用服务器套接字上的closesocket(),它是否与使用相同服务器套接字运行服务器的另一个线程分开,是否安全?
在Windows上,子进程可以继承大多数句柄.期望TCP套接字也可以继承.但是,当安装某些分层服务提供程序时,这不会按预期工作(来自Symantec的A/V产品,例如来自Symantec的PCTools,会导致我们的客户应用程序出现问题).
微软构建WinSock的方式,我们是否应该能够正确地继承SOCKET?
下面是一个C#程序,演示了这个问题.
服务器开始侦听套接字.客户端连接到服务器,发送消息,使用Shutdown(SocketShutdown.Send)关闭其发送的一半连接,让服务器知道消息的结束位置,并等待服务器的响应.服务器读取消息,进行一些冗长的计算(这里使用睡眠调用进行模拟),向客户端发送消息,然后关闭连接.
在Windows上,客户端的接收呼叫总是在2分钟后失败,因为"连接尝试失败,因为连接方在一段时间后没有正确响应,或者建立的连接失败,因为连接的主机未能响应",即使超时是设置为无限.
如果我使用Mono在Linux中运行该程序,即使我将"冗长操作"设置为10分钟也不会发生超时,但是无论是使用Mono还是.NET运行它都会在Windows中发生.如果我将超时设置为1秒,则在1秒后超时.换句话说,它在我设置的超时或2分钟内超时,以较小者为准.
一个类似的示例程序,服务器向客户端发送消息,没有从客户端到服务器的消息,也没有半关闭,按预期工作,没有超时.
我可以通过修改我的协议来解决这个问题,以便在消息完成时使用其他一些指示服务器的方法(可能在消息前面加上消息的长度).但我想知道这里发生了什么.当超时设置为无限时,为什么Socket.Receive会在半闭连接上超时?
根据我的理解,只有半封闭发送的连接应该能够无限期地继续接收数据.在Windows的这个基本部分中似乎不太可能存在错误.难道我做错了什么?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Net.Sockets;
using System.Net;
using System.Threading.Tasks;
using System.Diagnostics;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
// Start server thread
Thread serverThread = new Thread(ServerStart);
serverThread.IsBackground = true;
serverThread.Start();
// Give the server some time to start listening
Thread.Sleep(2000);
ClientStart();
}
static int PortNumber = 8181;
static void ServerStart()
{
TcpListener listener = new TcpListener(new IPEndPoint(IPAddress.Any, PortNumber));
listener.Start();
while (true) …Run Code Online (Sandbox Code Playgroud) 我的Winsock Delphi应用程序应该在所有网络接口上侦听多播UDP/IP流.它正常收听,直到我在具有不同网络适配器优先级顺序的另一台PC上尝试它.
然后我开始研究问题,并在一些论坛上发现INADDR_ANY(或0.0.0.0)在Windows和Linux中有不同的含义:
0.0.0.1第二个).引用:"如果此成员指定IPv4地址为0.0.0.0,则使用默认的IPv4多播接口" - 不提及是用于侦听还是用于发送.你能否证实或否认这一点?
如何在所有界面上真实收听?
这是我的一小段代码:
TMulticastListener = class(TThread)
private
mreq: ip_mreq;
............
end;
constructor TMulticastListener.Create;
var err: Integer;
wData: WsaData;
reuse: Integer;
begin
inherited Create(true);
err := WSAStartup(MAKEWORD(2, 2), wData);
if err = SOCKET_ERROR then begin
// Tell the user that we could not find a usable Winsock DLL
perror('WSAStartup');
Exit;
end;
// create what looks like an ordinary UDP socket
fd := …Run Code Online (Sandbox Code Playgroud) winsock ×10
c++ ×3
sockets ×3
windows ×3
c# ×2
linux ×2
networking ×2
.net ×1
asynchronous ×1
c ×1
delphi ×1
lan ×1
multicast ×1
portability ×1
porting ×1
winapi ×1
winsockets ×1
wsastartup ×1