gpt4 book ai didi

c# - Unity WebRequest 与 C++ 套接字对话

转载 作者:行者123 更新时间:2023-11-30 03:26:03 29 4
gpt4 key购买 nike

我目前正在统一开发一款游戏,这就是我遇到的问题。我正在尝试创建一个用 c/c++ 编写的服务器端客户端来与我的游戏进行通信。在c中找了一个socket程序,unity写了一个网络连接。

客户端会向服务器发送初始信息,但它永远无法正确捕获来自服务器的响应。

Unity 客户端代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;
using System.Net;

public class networking_interface : MonoBehaviour {

// Use this for initialization
void Start () {

// Create a web request to the hosted c++ socket on port 6006
HttpWebRequest request = new HttpWebRequest(new System.Uri("http://192.168.1.109:6006"));

// Create a GET method from the server
request.Method = "GET";

// Default the user credentials
request.Credentials = CredentialCache.DefaultCredentials;

// Get the response back from the server
// This is the line causing the error
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
}
}

从该网站找到的 C++ 服务器代码 http://www.linuxhowtos.org/C_C++/socket.htm

/* A simple server in the internet domain using TCP
The port number is passed as an argument */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

void error(const char *msg)
{
perror(msg);
exit(1);
}

int main(int argc, char *argv[])
{
int sockfd, newsockfd, portno;
socklen_t clilen;
char buffer[256];
struct sockaddr_in serv_addr, cli_addr;
int n;
if (argc < 2) {
fprintf(stderr,"ERROR, no port provided\n");
exit(1);
}
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0)
error("ERROR opening socket");
bzero((char *) &serv_addr, sizeof(serv_addr));
portno = atoi(argv[1]);
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;
serv_addr.sin_port = htons(portno);
if (bind(sockfd, (struct sockaddr *) &serv_addr,
sizeof(serv_addr)) < 0)
error("ERROR on binding");

listen(sockfd,5);
clilen = sizeof(cli_addr);

newsockfd = accept(sockfd,
(struct sockaddr *) &cli_addr,
&clilen);
if (newsockfd < 0)
error("ERROR on accept");
bzero(buffer,256);
n = read(newsockfd,buffer,255);
if (n < 0) error("ERROR reading from socket");
printf("Message from server\n%s\n",buffer);
n = write(newsockfd,"I got your message",18);
if (n < 0) error("ERROR writing to socket");
close(newsockfd);

close(sockfd);
return 0;
}

Bash 编译脚本。

#!/bin/bash
gcc main.c -o main
./main 6006

运行unity脚本时c++客户端的输出

Message from server
GET / HTTP/1.1
Content-Length: 0
Connection: keep-alive
Host: 192.168.1.109:6006

这是我遇到的错误。当统一 WebRequest 尝试从服务器获取 GetResponse() 时。

Exception: at System.Net.WebConnection.HandleError(WebExceptionStatus st, 
System.Exception e, System.String where)
at System.Net.WebConnection.ReadDone(IAsyncResult result)
at System.Net.Sockets.Socket+SocketAsyncResult.Complete()
at System.Net.Sockets.Socket+Worker.Receive()
System.Net.WebConnection.HandleError (WebExceptionStatus st,
System.Exception e, System.String where)
Rethrow as WebException: Error getting response stream (ReadDone2):
ReceiveFailure
System.Net.HttpWebRequest.EndGetResponse (IAsyncResult asyncResult)
System.Net.HttpWebRequest.GetResponse ()
networking_interface.Start () (at Assets/networking_interface.cs:21)

如果有任何帮助,我还运行 Linux Mint 18.1 Serena 作为服务器程序的主机操作系统。感谢任何帮助回答这篇文章的人!

最佳答案

您正在尝试将两种不同的网络协议(protocol)连接在一起。

HttpWebRequest 用于发出 REST 请求。这类似于 HTTP 请求。

C++ 端的 socket(AF_INET, SOCK_STREAM, 0); 函数用于创建纯 TCP 套接字。

这两者完全不同,HttpWebRequest/HTTP 建立在套接字之上。

做什么:

如果您决定在 C# 端使用 HttpWebRequest,则必须在 C++ 端实现 REST。您可以在 C++ 中找到 REST 的完整实现 here .

如果您决定使用纯 TCP 服务器(您当前的 C++ 代码),则还必须在 C# 端使用 TCP。这是在 C# 端使用 Socket 或 TcpClient 类完成的。 this上有很多例子发布。

关于c# - Unity WebRequest 与 C++ 套接字对话,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48605087/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com