2016-12-20 3 views
-1

C/C++의 네트워킹 도구에 대해 좀 더 배우고 싶습니다. Matlab을 통해 mex 파일로 코딩 된 일부 C echo 서버를 복사하기로 결정했습니다. 문제는 mex 파일을 빌드하고 실행하면 소켓이나 다른 것을 듣지 않고 영원히 돌아가는 것 같습니다. 우리가 mex 파일을 전혀 입력하지 않았는지 테스트하기 위해 코드에 print 문을 포함 시켰지만 현재는 전혀 인쇄하지 않습니다. 코드는 다음과 같습니다.Matlab C 기반 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"); 
} 

모든 도움을 주시면 감사하겠습니다.

+1

메인에서'echo()'호출을 주석 처리하고, 전체 정의를 주석 처리하고 다시 실행 해보십시오. 함수가 무효 인 경우에도 명시 적으로 'return'을 갖는 것도 좋은 생각입니다. – mpaskov

+0

@mpaskov echo() 메서드를 주석 처리하고 다시 컴파일 한 결과 "Starting"및 "Finishing"이 출력되어야합니다 ... 이상합니다. – Matt

+0

@mpaskov 그래서 아마도 스레딩 문제 일 것 같습니다 ... 난 그냥 파이썬에서 소켓을 발사하고 성공적으로 에코 서버에 연결하고/recv 에코 서버에서 보낼 수있었습니다 ... 아주 이상한 주요 수신 루프 내에서도 소켓 코드가 실행 중일 때 mexPrintf 명령이 작동하지 않습니다. – Matt

답변

-1

에코 서버를 테스트 한 후에 실제로 작동하는 것처럼 보입니다. 소켓이 열려있는 한 인쇄되지 않습니다. 아주 이상한!