【问题标题】:zmq_socket() is giving segmentation faultzmq_socket() 给出分段错误
【发布时间】:2015-06-05 00:11:58
【问题描述】:

我正在学习 zeromq 并且有以下测试代码:

void *context = (void *)zmq_ctx_new();

if (context == NULL) {
    printf("context is null\n");
} else {
    printf("context was created successfully\n");
}

printf("connecting to the 0mq server\n");
void *responder = zmq_socket (context, ZMQ_REQ);

printf("got socket\n");

if (responder == NULL) {
   printf("responder is null\n");
} else {
   printf("responder was created successfully\n");
}

当我运行代码时,它会在调用 zmq_socket() 时崩溃。这是输出:

启动 0mq 服务器上下文已成功创建连接到 0mq 服务器分段错误(核心转储)

我不确定为什么 zmq_socket() 会失败。我试图在我的 Makefile 中链接系列的开头移动 zmq 库。它仍然失败。

任何帮助将不胜感激。

【问题讨论】:

  • 我的第一句话:void context = (void)zmq_ctx_new();实际上, void context = (void)zmq_ctx_new();不知道为什么它没有带 * 那里。无论如何..只是想澄清一下
  • 你的调试器说段错误发生在哪里?
  • 为什么要在第一个语句中使用演员表?在 C 中不需要在此处强制转换。如果编译器在没有它的情况下抱怨,您可能找到了问题的原因。

标签: c zeromq


【解决方案1】:

改变

void context = (void)zmq_ctx_new();

进入

void *context = (void *)zmq_ctx_new();

而且,当我尝试您的代码时, void context = (void) zmq_ctx_new() 会导致编译错误。

这是我的代码,可以在我的 OSX 上运行。

gcc -o cli client.c -lzmq
gcc -o srv server.c -lzmq

client.c:

#include <zmq.h>
#include <string.h>
#include <stdio.h>
#include <unistd.h>

int main (void)
{
    printf ("Connecting to hello world server…\n");
    void *context = (void *)zmq_ctx_new ();
    void *requester = zmq_socket (context, ZMQ_REQ);
    zmq_connect (requester, "tcp://localhost:5555");

    int request_nbr;
    for (request_nbr = 0; request_nbr != 10; request_nbr++) {
        char buffer [10];
        char snd[] = "hello";
        printf ("Sending Hello %d…\n", request_nbr);
        zmq_send (requester, snd, sizeof(snd), 0);
        zmq_recv (requester, buffer, 10, 0);
        printf ("Received World %d\n", request_nbr);
    }
    zmq_close (requester);
    zmq_ctx_destroy (context);
    return 0;
}

server.c:

#include <zmq.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <assert.h>

int main (void)
{   
    //  Socket to talk to clients
    void *context = zmq_ctx_new (); 
    void *responder = zmq_socket (context, ZMQ_REP);
    int rc = zmq_bind (responder, "tcp://*:5555");
    assert (rc == 0); 

    while (1) {
        int  nrecv;
        char buffer [10];
        nrecv = zmq_recv (responder, buffer, 10, 0); 
        printf ("[%d] Received %s\n", nrecv, buffer);
        sleep (1);          //  Do some 'work'
        zmq_send (responder, "World", 5, 0); 
    }   
    return 0;
}   

【讨论】:

  • 感谢您的反馈。这就是我的代码的方式。出于某种原因,我的星星没有在这里显示。我的代码正是您建议的方式。
  • 奇怪的是,如果我调用 zmq_socket(&context, ZMQ_REQ) 则不会发生分段错误,但创建的套接字为 NULL。我知道将地址传递给上下文是一个错误的调用。但是,它告诉我问题可能不是代码。我不知道
  • @Kavita,zmq_socket(&context, ZMQ_REQ) 不正确,zmq_socket(context, ZMQ_REQ) 正确。 context 是 zmq_ctx_new() 返回的指针,不能将指针的地址传递给 zmq_socket。只需将指针本身传递给 zmq_socket。
  • 是的,我使用的是完全相同的代码。但是,对 zmq_socket 的调用失败并创建了一个核心转储。
  • 问题已解决。这是与图书馆相关的问题。谢谢你的直升机
猜你喜欢
  • 1970-01-01
  • 2019-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-10
相关资源
最近更新 更多