小编Ric*_*ral的帖子

在C#中对使用UDP协议的套接字感到困惑

我刚刚开始通过各种谷歌搜索来学习套接字,但是我在解决如何在C#中正确使用套接字时遇到了一些问题,我需要一些帮助.

我有一个测试应用程序(Windows窗体)和一个不同的类(实际上是它自己的.dll,但这是无关紧要的)我有我的套接字代码的所有服务器/客户端代码.

问题1)

在我的测试应用程序中,在服务器部分,用户可以单击"开始监听"按钮,我的套接字应用程序的服务器部分应该开始监听指定地址和端口上的连接,到目前为止一切顺利.

但是,应用程序将被阻止,除非有人连接到服务器,否则我无法执行任何操作.如果没有人连接怎么办?我该怎么处理?我可以指定接收超时但是呢?抛出异常,我该怎么办?我想要的是在主应用程序上进行某种活动,以便用户知道应用程序没有冻结并等待连接.但是如果没有连接,它应该超时并关闭所有内容.

也许我应该使用异步调用来发送/接收方法,但它们似乎令人困惑,我无法使它工作,只有同步工作(我将在下面发布我当前的代码).

问题2)

当某些发送/接收呼叫超时时,是否需要关闭任何内容.正如你在我当前的代码中看到的那样,我在套接字上有一堆关闭,但这种感觉不太合适.但是当操作超时且我没有关闭套接字时,它也感觉不对.

在我的两个问题的结论....我想一个不阻止的应用程序,所以用户知道服务器正在等待连接(例如有一个小的选框动画).如果在一段时间后从未建立连接,我想关闭应该关闭的所有内容.建立连接或在一段时间后没有发生连接时,我想告知结果的主要应用.

这是我的一些代码,其余的类似.该Packet班是代表我的自定义数据单元的自定义类,它只是一堆基于性能的enums现在,有方法将它们转换为字节,并返回到属性.

开始侦听连接的函数是这样的:

public void StartListening(string address, int port) {
    try {
        byte[] bufferBytes = new byte[32];

        if(address.Equals("0.0.0.0")) {
            udpSocket.Bind(new IPEndPoint(IPAddress.Any, port));
        } else {
            udpSocket.Bind(new IPEndPoint(IPAddress.Parse(address), port));
        }

        remoteEndPoint = new IPEndPoint(IPAddress.Any, 0);

        int numBytesReceived = udpSocket.ReceiveFrom(bufferBytes, ref remoteEndPoint);

        if(numBytesReceived == 0) {
            udpSocket.Close();
            return;
        }

        Packet syncPacket = new Packet(bufferBytes);

        if(syncPacket.PacketType != PacketType.Control) {
            udpSocket.Close();
            return;
        }
    } catch {
        if(udpSocket != null) {
            udpSocket.Close();
        } …
Run Code Online (Sandbox Code Playgroud)

c# sockets networking udp

6
推荐指数
1
解决办法
1万
查看次数

很难用glDrawElements理解索引

我试图绘制地形与GL_TRIANGLE_STRIPglDrawElements,但我有一个很艰难的时间去了解背后的东西指数glDrawElements...

这是我到目前为止所拥有的:

void Terrain::GenerateVertexBufferObjects(float ox, float oy, float oz) {
    float startWidth, startLength, *vArray;
    int vCount, vIndex = -1;

    // width = length = 256

    startWidth = (width / 2.0f) - width;
    startLength = (length / 2.0f) - length;

    vCount = 3 * width * length;
    vArray = new float[vCount];

    for(int z = 0; z < length; z++) {
        // vIndex == vIndex + width * 3  ||  width * 3 = 256 * …
Run Code Online (Sandbox Code Playgroud)

opengl vertex-buffer indices vertex-array

6
推荐指数
1
解决办法
1万
查看次数

我应该如何组织包括库在内的Android项目的源代码管理?

我需要帮助找出组织我的Android项目的最佳方法(或最佳实践).为简单起见,假设我的Android Eclipse工作区是C:\Android\Projects\.在该文件夹中,我喜欢从库中分离应用程序,我有两个其他文件夹,C:\Android\Projects\ApplicationsC:\Android\Projects\Components.

对于一个项目,我已经克隆从GitHub库到Components文件夹中,让我们说C:\Android\Projects\Componentes\SampleLib(这个文件夹里有两个文件夹TheLibTheLibExample).我的应用程序已创建C:\Android\Projects\Applications\MyTestApp.然后按照这些说明将库包含到应用程序中.

现在让我们说我想使用GitHub与开源社区分享我的应用程序.我将创建一个存储库并将所有内容从一个存储库中推送出去C:\Android\Projects\Applications\MyTestApp.

如果有人想分叉我的应用程序甚至帮助我,它将需要库来编译和运行它,这不包括在我的项目本身.该default.properties文件将有类似的东西android.library.reference.1=../Components/SampleLib/TheLib,有人需要手动克隆该库,他需要将它放在相同的相对路径,否则它会搞乱我的应用程序的源代码控制.

我能想到解决这个问题的唯一方法是组织我的工作区,如下所示:

C:\Android\Projects\Applications\MyTestApp\TheApp
C:\Android\Projects\Applications\MyTestApp\TheLib
C:\Android\Projects\Componentes\SampleLib
Run Code Online (Sandbox Code Playgroud)

我的存储库应该填充来自的内容C:\Android\Projects\Applications\MyTestApp\.

但是当库更新时会发生什么?我不能简单地拉出新的更改,我需要将它们复制到TheLib文件夹中.在之前的文件夹组织中,这不需要,因为我引用了原始克隆的存储库而不是副本.

那我该怎么办?我应该选择一个选项,让任何人都可以根据自己的需要处理我的项目处理库依赖关系,或者我应该选择第二个文件夹,并通过保持两个文件夹同步来为每个人提供更多工作,当原始文件从其中获取更改时库?

git version-control android github project-organization

6
推荐指数
1
解决办法
2963
查看次数

关于Android中SQLite数据库游标的几个问题

为了在我的应用程序中实现数据库访问,我遵循了Lars Vogel教程,但我对一些事情感到很困惑......

1)每次调用fetchTodo新游标时都会创建并返回.将前一个光标留给垃圾收集器.所以,如果我不使用startManagingCursor甚至CursorLoader就此而言,.close()当我完成它时,我应该在光标上调用吗?fetchTodo当然,在范围之外,例如:

Cursor cursor = mNotesAdapter.fetchTodo();
// do something...
cursor.close();
Run Code Online (Sandbox Code Playgroud)

我已经完成了这个游标,并且将在下一次获取时创建新游标,如果我这样关闭它还是应该将它留给垃圾收集器?虽然我认为我在谈论两件完全不同的事情......重点是,我应该像上面的例子那样关闭它吗?

2) Cursor也有一个.deactivate()方法,文档说它使用较少的资源(比活动游标).我什么时候应该使用它?例如,在我的应用程序中,我有一个ListActivity通过a填充SimpleCursorAdapter(代码初始化只调用一次).正在使用的游标是一个类成员变量,因为我需要在填充列表的方法之外.当从中删除某些内容时,我需要它来重新查询数据库.但是,除非删除记录,这是用户操作并且可能需要一段时间才会发生,我应该在此期间停用光标吗?因为当我.requery()再次打电话时它会再次激活.或者SimpleCursorAdapter由于光标不活动而停止工作?

编辑:我刚测试了这个,发现deactivate()在设置光标适配器后我无法调用.如果光标未激活,则列表将为空,因此只要显示ListActivity,它就需要保持活动状态.最后,我们应该让它StartManagingCursor处理它.或新的CursorLoader.

3)我知道startManagingCursor/ stopManagingCursor已被弃用但我不是针对Honeycomb(至少目前为止)并且我现在不想处理新CursorLoader的.但是在上面的教程中,startManagingCursor无处不在,但stopManagingCursor从未调用过一次.为什么不?Android会以自己的方式处理吗?我应该打电话的任何情况stopManagingCursor

database sqlite android cursor android-loadermanager

6
推荐指数
1
解决办法
4749
查看次数

Android构建目标对最终APK有什么影响?

我的问题突然出现了一个非常类似的问题,这一个.但是接受的答案(单一的)指向另一个问题,这个问题并没有真正回答原始问题.

Android文档说明:

Build Target指定您希望针对您的应用程序构建的Android平台.

但这究竟是什么意思呢?

我看到它的方式,我可以拥有minSdkVersion=4,targetSdkVersion=10但将构建目标设置为API级别4.会发生什么?Eclipse假设我正在为API Level 4开发,任何方法,常量或任何在4级以上API级别上定义的将无法使用.如果我尝试使用它们,应用程序将无法编译.我知道这件事.

但是,让我换一种说法......

比方说,我只设置minSdkVersion=4,targetSdkVersion 没有定义.我也没有使用任何方法或常量仅在4级以上的API级别上可用.在这种情况下,我选择的构建目标真的很重要吗?它会对最终的APK有什么影响吗?

eclipse android apk build-target

6
推荐指数
1
解决办法
4103
查看次数

如何使用Gradle提交/推送Git标签?

我创建了一个特定的Gradle任务,只能在Jenkins构建系统中调用.我需要让这个任务依赖于另一个任务,它应该在成功编译项目后标记主分支的HEAD.

我不知道如何使用Gradle将标签提交/推送/添加到远程存储库中的特定分支.实现这一目标的最简单方法是什么?

任何帮助真的很感激......

git tagging gradle

6
推荐指数
3
解决办法
2万
查看次数

如何在启动时只渲染一次 React 组件?

我一直在阅读有关性能的文档,但找不到我的问题的答案...

我的应用程序上有一堆按钮,它们将基于某些属性而不是状态呈现,父组件永远不会改变它们的属性。然后我有这个onKeyDown事件处理程序,它将侦听一些键并更新另一个组件。

我的问题是,当按下键并更新这个组件时,所有其他按钮也会呈现(通过 Chrome 的 React 开发工具观察)。我还没有shouldComponentUpdate(nextProps, nextState)在我的按钮上实现,但 React 默认不应该有这种行为吗?我的意思是,比较this.propsnextProps,如果他们是完全一样的,不叫render()

我是否应该为每个只应在应用程序启动时呈现一次的组件自己执行此操作?

编辑: PureComponent似乎解决了问题......但我没有创建一个新问题,而是用一个相关问题更新这个问题:

为什么文档不建议默认使用基于 PureComponent 的所有组件?反对使用PureComponent默认而不是典型的论点是什么Component

javascript performance reactjs

6
推荐指数
1
解决办法
1万
查看次数

将这些haskell Int列表转换为另一个列表

我有以下Int列表:

t1 = [1000, 1001, 1002, 1003, 1004]
t2 = [2000, 2001, 2002]
t3 = [3000, 3001, 3002, 3003]
Run Code Online (Sandbox Code Playgroud)

列表大小是可变的,它们不仅仅是这个示例中的3.它们可以包含1个元素或更多元素.然后我有这个:

tAll = [t1, t2, t3]
Run Code Online (Sandbox Code Playgroud)

我需要一个功能,"变成" 高大弄成这个样子:

[[1, 1000, 2000, 3000],
[2, 1001, 2001, 3001],
[3, 1002, 2002, 3002],
[4, 1003, 0, 3003], 
[5, 1004, 0, 0]]
Run Code Online (Sandbox Code Playgroud)

是否有捷径可寻?

编辑: 对不起,我发布了这个匆忙,这不是我想要的.我更新了上面的代码......

haskell list

5
推荐指数
1
解决办法
664
查看次数

WIFSIGNALED、WIFSTOPPED、WIFCONTINUED 的 C 语言测试用例

我正在使用 waitpid() 和 signal() 并且我正在寻找可靠的测试用例来返回 WIFSIGNALED(status) = WIFSTOPPED(status) = WIFCONTINUED (status) = true 但找不到任何......

小心告诉我如何确保这些返回 true 以便我可以调试我的代码?

另外,一些关于我应该用 signal() 捕捉什么信号来测试这些宏的提示会很有帮助......

c signals waitpid

5
推荐指数
1
解决办法
2万
查看次数

长时间不活动后,.NET应用程序非常慢

我不确定问题标题是否是最好的,但它是我能想到的最好的...

我有这个.NET(C#)应用程序,它启动Windows并保持打开,直到计算机关闭.应用程序停留在托盘上,然后单击托盘图标将其打开并以相同方式关闭它.

该应用程序一开始并不慢,它正常工作,没有问题.但是经过长时间的不活动,在很长一段时间内第一次再次显示它时会变得很慢.明白我的意思了吗.

例如,我无法使用/打开(单击托盘图标)几天,在那些日子之间我打开和关闭并使用了很多其他应用程序,也是重型应用程序,我可能已经休眠并重新启动计算机几次,当我需要再次打开我的应用程序,这很慢.使用几分钟后,它恢复正常并正常工作.

我相信这与内存管理有关,系统可能会释放我应用程序的大部分内存,因此其他程序可以更有效地使用它.也许.NET内存管理与它有关...

无论是什么原因,我可以做些什么来优化我的应用程序的问题?

.net c# performance

5
推荐指数
2
解决办法
3264
查看次数