基于 Matlab C 的 Mex 文件,套接字未运行

Posted

技术标签:

【中文标题】基于 Matlab C 的 Mex 文件,套接字未运行【英文标题】:Matlab C-based Mex file with sockets not running 【发布时间】:2016-12-20 21:35:00 【问题描述】:

我想更多地了解 C/C++ 中的网络工具,我决定将一些 C 回显服务器复制到一个 mex 文件中,以便通过 Matlab 使用它。问题是,当我构建 mex 文件并执行它时,它似乎永远运行而无需侦听套接字或任何东西。我在代码中包含了一些打印语句来测试我们是否输入了 mex 文件,但目前它们根本没有打印。代码如下:

#define char16_t UINT16_T //shenanigans with the compiler

#include "mex.h"
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <stdio.h>
#include <string.h>

void echo()

    char str[100];
    int listen_fd, comm_fd;
    struct sockaddr_in servaddr;

    listen_fd = socket(AF_INET, SOCK_STREAM,0);
    bzero(&servaddr, sizeof(servaddr));

    servaddr.sin_family = AF_INET;
    servaddr.sin_addr.s_addr = htons(INADDR_ANY);
    servaddr.sin_port = htons(22000);

    bind(listen_fd, (struct sockaddr *) &servaddr, sizeof(servaddr));

    mexPrintf("Listening");

    listen(listen_fd, 10);

    comm_fd = accept(listen_fd, (struct sockaddr *) NULL, NULL);
    mexPrintf("Connected");

    while(1)
    
        bzero(str, 100);
        read(comm_fd, str, 100);
        mexPrintf("Echoing back - %s", str);
        write(comm_fd, str, strlen(str)+1);
    



void mexFunction(int nlhs, mxArray *plhs[],
                 int nrhs, const mxArray *prhs[])

    mexPrintf("Starting");

    echo();

    mexPrintf("Finishing");

任何帮助将不胜感激。

【问题讨论】:

在 main 中注释掉 echo() 调用,甚至可以注释掉它的整个定义并尝试再次运行它。即使函数是 void 也有一个明确的 return 也是一个好主意。 @mpaskov 我注释掉了 echo() 方法并重新编译,它输出“Starting”和“Finishing”,因为它应该有......奇怪。 @mpaskov 所以这似乎是一个线程问题...我刚刚在 python 中启动了一个套接字,并且能够成功连接到 echo 服务器并从 echo 服务器发送/接收...很奇怪 mexPrintf 命令在套接字代码运行时不起作用,即使在主监听循环中也是如此。 奇怪,不知道是什么原因造成的。但我很高兴这对你有用。 【参考方案1】:

所以在测试了回显服务器之后,它实际上似乎在工作,只要有一个套接字打开它就不会打印。很奇怪!

【讨论】:

以上是关于基于 Matlab C 的 Mex 文件,套接字未运行的主要内容,如果未能解决你的问题,请参考以下文章

MATLAB mex - 未定义符号 _max

matlab mex clang C++11线程->未定义符号错误

mex 文件未在 MATLAB 7.5.0 (R2007b) 中执行

MATLAB Mex 套接字包装库

Matlab:无法使用 openmp 编译 mex(未定义的参考)

Matlab Mex代码未编译