-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");
}
모든 도움을 주시면 감사하겠습니다.
메인에서'echo()'호출을 주석 처리하고, 전체 정의를 주석 처리하고 다시 실행 해보십시오. 함수가 무효 인 경우에도 명시 적으로 'return'을 갖는 것도 좋은 생각입니다. – mpaskov
@mpaskov echo() 메서드를 주석 처리하고 다시 컴파일 한 결과 "Starting"및 "Finishing"이 출력되어야합니다 ... 이상합니다. – Matt
@mpaskov 그래서 아마도 스레딩 문제 일 것 같습니다 ... 난 그냥 파이썬에서 소켓을 발사하고 성공적으로 에코 서버에 연결하고/recv 에코 서버에서 보낼 수있었습니다 ... 아주 이상한 주요 수신 루프 내에서도 소켓 코드가 실행 중일 때 mexPrintf 명령이 작동하지 않습니다. – Matt