- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 SFML 的 TcpSocket
类来发送和接收数据,但由于某种原因,我一直收到错误 Segmentation fault: 11
。这是服务器类:
#include "ServerGame.hpp"
ServerGame::ServerGame()
{
}
void ServerGame::sendData(char data[3][3])
{
if (client.send(data, 9) != sf::Socket::Done)
{
//std::cout << "error" << std::endl;
}
}
void ServerGame::connect()
{
sf::TcpListener listener;
// bind the listener to a port
if (listener.listen(666) != sf::Socket::Done)
{
std::cout << "error" << std::endl;
}
// accept a new connection
if (listener.accept(client) != sf::Socket::Done)
{
std::cout << "error" << std::endl;
}
}
char** ServerGame::receiveData()
{
char **data;
data = new char*[3];
for(int i = 0; i < 3; ++i)
{
data[i] = new char[3];
}
std::size_t received;
// TCP socket:
if (client.receive(data, 9, received) != sf::Socket::Done)
{
// error...
}
return data;
}
这是客户端类:
#include "ClientGame.hpp"
#include <iostream>
ClientGame::ClientGame()
{
}
void ClientGame::connect()
{
sf::Socket::Status status = socket.connect("127.0.0.1", 666);
if (status != sf::Socket::Done)
{
// error...
}
}
void ClientGame::sendData(char data[3][3])
{
if(socket.send(data, 9) != sf::Socket::Done)
{
//error...
}
}
char** ClientGame::receiveData()
{
char **data;
data = new char*[3];
for(int i = 0; i < 3; ++i)
{
data[i] = new char[3];
}
std::size_t received;
if (socket.receive(data, 9, received) != sf::Socket::Done)
{
std::cout << "error" << std::endl;
}
return data;
}
这是启动服务器和发送数据的主类:
#include "ServerGame.hpp"
#include "ClientGame.hpp"
int main()
{
ServerGame sg;
sg.connect();
char arr[3][3] =
{
{'a', 'b', 'c'},
{'d', 'e', 'f'},
{'g', 'h', 'i'}
};
sg.sendData(arr);
}
这是启动客户端和接收数据的主类:
#include "ClientGame.hpp"
int main()
{
ClientGame cg;
cg.connect();
char** arr = cg.receiveData();
std:: cout << arr[0][0] << std::endl;
}
我首先编译并运行服务器类,然后对客户端类执行相同的操作。当我尝试访问我发送的字符数组的第一个元素时,它给出了一个段错误。为什么会这样?
最佳答案
一个问题是假设 char**
与 char
的二维数组相同。它们不相同。
当你这样做时:
char **data;
data = new char*[3];
for(int i = 0; i < 3; ++i)
{
data[i] = new char[3];
}
您不是使用连续数据布局动态创建二维 char
数组,类似于 char[3][3]
。内存布局可能看起来像这样:
data[0] -> 0x32181000
data[1] -> 0x321A9760
data[2] -> 0x321AC980
换句话说,行散布在整个堆内存中,并且不连续。
因此当你调用这个函数时:
if (socket.receive(data, 9, received) != sf::Socket::Done)
socket.receive
函数需要一个 9 字节的连续缓冲区,但您没有提供它。 receive
函数很可能会覆盖第一行,最多 6 个字节从第一行的边缘掉落(第一行被分配为只有 3 个字节),因此溢出到内存中导致段错误。
我认为问题源于您试图将二维数组从一个函数传递到另一个函数,并使用 char**
代替实际的二维数组而犯了错误。
为了在不引入指针的情况下使事情变得更简单,创建一个包含二维 char
数组的struct
,然后在函数之间传递这个结构。
struct char2D
{
char myArray[3][3];
};
然后代替 char **
,只使用 char2D
的实例,并在需要时引用内部数组。
例如:
char2D ClientGame::receiveData()
{
char2D data;
std::size_t received;
if (socket.receive(&data.myArray[0][0], 9, received) != sf::Socket::Done)
{
std::cout << "error" << std::endl;
}
return data;
}
然后在 main
中:
int main()
{
ClientGame cg;
cg.connect();
char2D arr = cg.receiveData();
std:: cout << arr.myArray[0][0] << std::endl;
}
这样做的原因是 struct
是可复制和可赋值的。因此,每当您按值传递并按值返回时,内部数组都会被复制。
关于c++ - 在 SFML 中使用 TcpSocket 发送数据导致段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57023655/
我正在使用 voip 推送通知制作 ios 应用程序。 我想从 Node js 发送 voip 推送通知,但不是很好。 我阅读了本教程 CallKit iOS Swift Tutorial for V
我编写了一个服务器,当浏览器尝试连接到某些站点时,它会检查黑名单并发回 404,但是当我调用 send() 时没有错误,但消息不会出现在网络上浏览器,除非我关闭连接? 有什么建议吗? 接受来自浏览器的
#include int main() { char c = getchar(); //EOF (ctrl + d ) while( ( c = getchar() ) != '?'
我正在尝试使用MailMessage对象通过PowerShell发送电子邮件。该脚本使用Import-CSV来使用文件,然后在电子邮件正文中使用ConvertTo-HTML。由于我要发送的电子邮件客户
我需要创建一个脚本,每 30 秒对网络流量进行一次采样并存储发送/接收的字节。该数据随后用于绘制图形。我编写了一个在 Windows 2012 上完美运行的程序,但我意识到某些 cmdlet 在以前的
我正在运行“autoit3.chm”文件。当它运行时,我想发送一个向下键箭头,但它不起作用: $file = FileGetShortName("C:\Users\PHSD100-SIC\Deskto
当我使用网络浏览器测试我的程序时,我可以很好地写入套接字/FD,所以我决定循环它并在连接中途切断连接,我发现了一个问题。 send() 能够在套接字不可用时关闭整个程序。我认为问题在于该程序陷入了第
我正在运行“autoit3.chm”文件。当它运行时,我想发送一个向下键箭头,但它不起作用: $file = FileGetShortName("C:\Users\PHSD100-SIC\Deskto
所以我试图向自己发送数据并接收数据然后打印它,现在我已经测试了一段时间,我注意到它没有发送任何东西,事实上,也许它是,但我没有正确接收它,我需要这方面的帮助。 这就是我用来发送数据的
问题:开发人员创建自己的序列化格式有多常见?具体来说,我使用 java 本质上将对象作为一个巨大的字符串发送,并用标记来分隔变量。 我的逻辑:我选择这个是因为它几乎消除了语言依赖性(忽略java的修改
我必须在 Linux 上编写一个应用程序,该应用程序需要与具有自定义以太网类型的设备进行通信。甚至在如何编写这样的应用程序中也有很多解决方案。一个缺点是需要 root 访问权限(AFAIK)。之后释放
我有一个包含三个单选按钮选项的表单。我需要将表单数据提交到另一个文件,但由于某种原因,发送的数据包含所选单选按钮的值“on”,而不是 value 属性的值。 我尝试通过 post() 函数手动操作和发
基本上我想实现这样的目标: Process 1 Thread 1 Receive X from process 2 Thread 2 Receive Y from proces
我目前正在 Google App Engine 上开发一个系统,对它还很陌生,我正在使用 Java 平台进行开发。我在 servlet 之间发送 session 对象时遇到问题。我已经在 appeng
当我尝试将“this”(触发的元素)作为参数发送给函数时,函数收到“Object[Document build.php]”作为参数,而不是触发的元素。请让我知道我的错误: function set(a
我正在寻找让我的应用响应联系人 > 发送的魔法咒语。我希望能够接收联系人的 URI 以便检索联系人。谁有 list 过滤器/代码 fragment 吗? 最佳答案 我没有睾丸,但您可以尝试基于 ACT
关于我心爱的套接字的另一个问题。我先解释一下我的情况。之后我会告诉你是什么困扰着我。 我有一个客户端和一个服务器。这两个应用程序都是用 C++ 编写的,实现了 winsock2。连接通过 TCP 和
我看到了这篇文章 http://www.eskimo.com/~scs/cclass/int/sx5.html 但这部分让我感到困惑:如果我们已经使用 send_array 或 send_array_
我对这行代码有疑问。我必须将一个数据包带到一个端口并重新发送到接口(interface)(例如:eth0)。我的程序成功地从端口获取数据包,但是当我重新发送(使用 send())到接口(interfa
我正在尝试编写一个 X11 输入驱动程序,它可以使用我的 Android 手机上的触摸屏来移动和单击鼠标。我可以正常移动鼠标,但我无法让应用程序正确识别点击。我当前的代码位于 https://gist
我是一名优秀的程序员,十分优秀!