[英]Connect C# client to C++ server
我很沮喪,我無法正常工作。
我的C ++代碼( _details
是addrinfo*
而_socket
是SOCKET
):
struct addrinfo hints;
_socket = socket(AF_INET, SOCK_STREAM, 0);
if (_socket < 0)
throw "Invalid socket";
ZeroMemory(&hints, sizeof(hints));
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;
hints.ai_flags = AI_PASSIVE;
if (getaddrinfo(NULL, Port.c_str(), &hints, &_details) != 0)
{
throw "GetAddrInfo failed";
}
if ((bind(_socket, _details->ai_addr, this->_details->ai_addrlen)) != 0)
{
throw "Bind Unsuccessful";
}
freeaddrinfo(this->_details);
if (listen(this->_socket, SOMAXCONN) != 0)
throw "Listen Unsuccessful";
client = accept(this->_socket, (struct sockaddr*)&client_addr, &addrlen);
一個簡單的C ++服務器。 C ++和Python客戶端可以與上述服務器完美配合,並按預期完成所有操作。
然后是客戶:
Socket s;
IPAddress ip = Dns.GetHostEntry("127.0.0.1").AddressList[0];
int port = 7777;
IPEndPoint remoteEP = new IPEndPoint(ip, port);
s = new Socket(AddressFamily.InterNetworkV6,
SocketType.Stream, ProtocolType.Tcp);
bool isConnected = false;
while (!isConnected)
{
try
{
s.Connect(remoteEP);
isConnected = true;
}
catch (Exception e1)
{
System.Threading.Thread.Sleep(2000);
}
}
C#客戶端與C#服務器完美配合。
所有這些都一起工作-他們只是沒有。 我嘗試連接到服務器,但是客戶端始終最終拋出System.Net.Sockets SocketException
,錯誤代碼為10061
,聲稱C ++服務器拒絕了它。
SO上的一個線程問了一個類似的問題,得到的答案是,每個連接請求后他都應該睡覺,然后再試一次(如您所見,已經完成)。
另一個站點上的另一個線程聲稱問題出在服務器上,並且他將C ++服務器參數從主機字節順序轉換為網絡字節順序:
listenSocketAddress.sin_port = htons((u_short)port);
listenSocketAddress.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
但是我使用的addrinfo
不包含與sockaddr_in
相同的變量。
如何連接這兩個?
據我所知,您的C ++ AF_INET
在使用IPv4( AF_INET
),而您的C# AddressFamily.InterNetworkV6
在使用IPv6( AddressFamily.InterNetworkV6
)。 更改服務器以使用IPv6,或更改客戶端以使用IPv4。 或者理想情況下,讓他們使用最有效的方式,並使用主機名代替IP地址。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.