小编nyy*_*kki的帖子

c /中断系统调用/ fork与线程

我发现了线程实现的问题,这对我来说很奇怪.也许有些人可以向我解释,会很棒.

我正在开发类似代理的程序,一个程序(在不同的机器上运行),它通过eth0接收数据包并通过ath0(无线)发送到另一台机器,它正在完成同样的事情.实际上我完全不确定是什么导致了我的问题,那是因为我对一切,linux和c编程都是新手.

我开始两个线程,

  • 一个是在eth0上侦听(套接字)传入的数据包并通过ath0(也是套接字)发送出去
  • 另一个线程正在监听ath0并通过eth0发送.

如果我使用线程,我会得到一个错误:

sh-2.05b# ./socketex 
Failed to send network header packet.
: Interrupted system call
Run Code Online (Sandbox Code Playgroud)

如果我使用fork(),程序按预期工作.有人可以向我解释这种行为吗?

只是为了显示发送者实现,它的代码片段是:

while(keep_going) {
    memset(&buffer[0], '\0', sizeof(buffer));

    recvlen = recvfrom(sockfd_in, buffer, BUFLEN, 0, (struct sockaddr *) &incoming, &ilen);
    if(recvlen < 0) {
        perror("something went wrong / incoming\n");
        exit(-1);
    }

    strcpy(msg, buffer);
    buflen = strlen(msg);

    sentlen = ath_sendto(sfd, &btpinfo, &addrnwh, &nwh,  buflen, msg, &selpv2, &depv);

    if(sentlen == E_ERR) {
        perror("Failed to send network header packet.\n");
        exit(-1);
    }
}
Run Code Online (Sandbox Code Playgroud)

更新:我的主文件,启动线程或进程(fork)

int main(void) { …
Run Code Online (Sandbox Code Playgroud)

c sockets fork pthreads

4
推荐指数
1
解决办法
6245
查看次数

JavaFX /如何在启动时加载/填充值?

我刚开始使用JavaFX,已经需要一些建议.我applicaton.fxml在MainApplication的start(Stage ...)方法(在我的application.fxml文件中指定了ApplicationController )中使用FXMLLoader 加载(使用Oracle SceneBuiler创建).

<AnchorPane id="AnchorPane" disable="false" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="600.0" prefWidth="800.0" styleClass="theme" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/2.2" fx:controller="app.AppController">
...more code here...
<ComboBox id="cmb_locations" fx:id="cmb_locations">
    <items>
        <FXCollections fx:factory="observableArrayList">
            <String fx:value="Item 1" />
            <String fx:value="Item 2" />
            <String fx:value="Item 3" />
        </FXCollections>
    </items>
</ComboBox>
Run Code Online (Sandbox Code Playgroud)

现在,我有一个ComboBoxapplicaton.fxml,其中有三个项目(默认项).我需要的是ComboBox在启动期间使用我自己的值填充它.有谁知道如何实现这一点以及在何处放置相关的代码片段(app.AppController或类似的东西)?提前致谢.

javafx javafx-2

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

Java/OSGi将现有应用程序修改为OSGi服务

我是OSGi的新手,也是接近它的一切.

跳进问题:我有一个服务器类,它保存了一个监听器列表,监听器可以通过一个方法(register(this))将自己的监听器放入上面提到的列表中来注册它们(所有监听器当然都实现了服务器类监听器接口) :

public void register(ServerListener listener) {
    if(theListeners == null)
        theListeners = new ArrayList<ServerListener>();

    theListeners.add(listener);
}
Run Code Online (Sandbox Code Playgroud)

这是ServerListener界面:

public interface ServerListener {
    public void update(JsonObject data);
}
Run Code Online (Sandbox Code Playgroud)

现在,服务器类通过一种update(JsonObject object)方法不时向监听器提供新数据.

public void updateListeners() {
    new Thread() {
        public void run() {
            for(ServerListener l : theListeners) {
                l.update(jsonObject);
            }
        }
    }.start();
}
Run Code Online (Sandbox Code Playgroud)

现在,我想将服务器类修改为OSGi框架(Knopflerfish)中的服务包.我根本不熟悉.我想尝试只是为了好玩,但我现在这样做的方式不起作用,听众实际上并不知道他们应该实现ServerListener接口.因此服务器无法通过接口注册它们.

问题是,我想服务器推送数据,而不是客户端拉(根据我的理解,这会更容易).有人(了解我的不良解释)能指出我正确的方向吗?

java osgi

3
推荐指数
1
解决办法
380
查看次数

C/如何监听多个UDP端口

我正在开发的应用程序应该能够监听多个(现在是 4 个)端口号。我是否需要为每个端口创建一个套接字,例如:

if((sock_fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
    perror("error: could not create UDP socket\n");
    exit(EXIT_FAILURE);
}

bzero(&sock_addr, sizeof(sock_addr));
sock_addr.sin_family    = AF_INET;
sock_addr.sin_port      = htons(port1);
sock_addr.sin_addr.s_addr   = inet_addr(INADDR_ANY);

if(bind(sock_fd, (struct sockaddr *) &sock_addr, sock_len) < 0) {
    perror("error: could not bind UDP socket to AU\n");
    exit(EXIT_FAILURE);
}
Run Code Online (Sandbox Code Playgroud)

或者有更优雅的方法来做到这一点吗?我还读到了该select()声明,我应该使用它吗?我想监听多个端口的原因很简单,它应该识别我正在与之通信的应用程序。例如,每个端口一个应用程序。

预先感谢您的评论。

// 更新:我应该如何为每个端口设置一个套接字?

c sockets

3
推荐指数
1
解决办法
3952
查看次数

使用中心点(不是左上角)绘制椭圆

我试图找到一个基于中心点绘制椭圆的解决方案,而不是在Ellipse2D.Double的构造函数中指定的左上角.如图所示,椭圆应具有相同的中心点和比例,是否有可能?

在此输入图像描述

在此先感谢您的帮助.

java graphics2d

3
推荐指数
1
解决办法
6029
查看次数

如何在JPanel上添加多个图层

我需要一些Java Swing组件及其功能方面的帮助.我需要一个添加JPanelJFrame和油漆的Ellipse2D就可以了.在Ellipse2D我想要添加另一个元素,在我的情况下它是一张图片(现在我使用一个ImageIcon,也许是错误的).如何Ellipse2D在面板上添加和添加图片,如附图所示?

我需要分离图像的原因是,因为我需要有时改变椭圆的填充颜色.

谢谢你的帮助.在此输入图像描述

java swing paintcomponent

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

从shell脚本运行java类

我有一个问题是将Windows批处理文件更改为unix shell脚本,以便在我的linux机器上执行相同的java代码.

我的shell脚本看起来像这样:

#!/bin/bash

libdir=../lib
bindir=.
LIBS=$libdir/lib_1.jar;$libdir/lib_2.jar;$libdir/lib_3.jar;$libdir/lib_4.jar

java -cp $bindir;$LIBS com.sample.SampleServer
Run Code Online (Sandbox Code Playgroud)

对我来说它看起来正确但我收到以下错误信息: Failed to load Main-Class manifest attribute from /home/user/development/lib/lib_2.jar

在此先感谢您的帮助.

java shell classpath

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

如何正确停止ServerSocket线程?关闭套接字失败

我知道之前已经讨论过这个问题了,但我找不到合适的解决方案来解决我的问题.我想ServerSocket在后台运行一个线程,监听指定的端口.它实际上工作,但只有一次.似乎服务器正在侦听的端口从未正确关闭,并且在我尝试重新启动时仍然处于活动状态(O不重新启动线程本身).有人能说出为什么它不能正常工作吗?在此先感谢您的帮助......!

编辑:

我在客户端遇到同样的问题.我有一个发送者线程,也不能停止.最好的方法是什么?

ClientConnector只是它连接到服务器端口和发送数据的类.这不是一个线程或类似的东西.

这是我的发件人类:

private class InternalCamSender extends Thread {

    private int sendInterval = 500;             // default 500 ms
    private ClientConnector clientConn = null;

    public InternalCamSender() {
        this.sendInterval = getSendingInterval();
        this.clientConn = new ClientConnector();
    }

    @Override
    public void run() {
        while(!Thread.currentThread().isInterrupted()) {
            clientConn.sendCamPdu(CodingScheme.BER, createNewPDU());
            try {
                Thread.sleep(sendInterval);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我试着像这样处理它的行为:

    if(jButton_startSending.getText().equals(STARTSENDING)) {
        new Thread() {
            public void run() {
                iSender = new InternalCamSender();
                iSender.start();
                jButton_startSending.setText(STOPSENDING);
            }
        }.start(); …
Run Code Online (Sandbox Code Playgroud)

java multithreading serversocket

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