EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
Matlab与C语言的应用接口程序
$ D) L' J) }* L9 ^9 K2 o、理解几个常用的socket函数
2 r+ I5 }% L% M #include
4 `3 |" @( u( R( H8 Q) r; u4 b#include
" x" a! ~6 x7 V- k9 Y7 k& q" Kint socket(int domain,int type,int portocol); v& O+ B! q! u+ B6 J: M( k
domain指所使用的协议族(family)可以为AF_UNIX和AF_INET,一般只用AF_INET(指Internet)type指所用的传输类型,可以为SOCK_STERAM(面向连接的TCP),和SOCK_DGRAM(面向无连接的udp) 7 }- |% K$ c0 Y$ O( B) x" I
int bind(int s,const struct sockaddr *address,size_t address_len);
0 G6 f! L/ X0 _* us为socket返回的文件描述符 . e! R" R! P- T' z( K) e" J$ ?5 G' H/ O
address为协议族名称和其他信息
0 R; Y: I2 K" ?具体结构为struct sockaddr_in{ 7 b9 A( \1 c5 I
short sin_family;/*协议族
) Q! Y; f( ^8 y; Pu_short sin_port;/*端口*/" q, Y1 \1 V# t
struct in_addr sin_addr;/*地址*// |2 W/ ~/ @' }) z' U& D
char sin_zero[8];
9 { P2 V; J/ b* z! R};' d9 P9 A9 }& y8 V& I/ n
int listen(int s,int backlog);
^8 r6 J, S- Lbacklog为容许的请求数目& q2 g% p- Y" |* y& I7 {6 c1 E
int accept(int s,struct sockaddr *address,int *address_len);
7 a: B; c% g* _- b1 c5 @这里的前两个参数同上! S% ?: R6 h4 d# F9 m- H
addres_len是要传递一个记有结构大小的地址
4 V; b/ F6 q1 w: s7 cint connect(int s,struct sockaddr *address,size_t address_len);
1 B' h2 C. `: q0 S' F这里的参数意义同bind % E% k, R2 \$ q% a7 o
2.理解建立程序的一般调用过程 0 U! p) D% ~) }, o$ i
要建立一个处理连接的服务器端程序,首先要调用socket函数创建一个socket,返回一个文件句柄fd,使以后对它的操作就象对普通文件设备一样读写。 : h1 c9 X1 m! n; E2 @% n: @3 U
由于是服务器端必须对一个断口进行监听其他机器的请求,所以接下去调用bind函数,传入刚才的fd,定义好地址和端口,由于是要接受来自任何host的连接所以应讲sin_addr赋为INADDR_ANY,port为你所设定的端口。 . c6 G' @! Z6 C8 F! V! G* t
注意:这里的地址和端口是网络字节顺序,所以要调用htonl,htons完成主机字节顺序) H3 [& S" s& w- l
到网络字节的转变
; d; m( ]! r+ _接下来就是监听listen,调用accept接受来自客户端的请求,accpet返回连接后的文件描述符,你就可以用它进行收发信息(对应于read,write)这样的一个过程就是socket->bind->listen->accpet->Read,write
5 |7 G* A0 N& k而对于客户端则是socket->connect->read,write
2 X( j$ x" O: M- ~三、C语言程序MEX文件实例
7 Q4 y u. @7 x9 I; uMATLAB 5 API提供了一系列程序来处理MATLAB所支持的各种数据类型,每一种数据类型都有对应函数共你使用来处理对应的数据。下面给出一个简单的C语言程序和与之对应的MEX文件代码,该程序的功能是将标量x加倍。
6 Z/ z. J3 |! W% i3 v1 X+ k#include "math.h"9 m$ z$ m* J' ?2 s
void TImestwo(double y[], double x[])
! o( v. E0 r4 X. F5 X+ p$ Y$ D' t{- }5 t$ @/ I9 ~+ w$ ^
y[0]=2.0*x[0];( K$ ?3 Z+ h2 k: U+ F1 Q
return;
" h; P. p, J% f9 m6 o} # i9 x- Z& ^" `: U6 v
下面是与C语言程序功能相同的MEX文件: \7 M7 A% C3 \7 X
#include "mex.h"
5 X# z4 t0 A9 Z+ avoid TImestwo(double y[], double x[]), o) T8 D9 D/ R) w0 U' v( g
{' A4 m6 V/ o, F; ]! W, ~
y[0]=2.0*x[0];9 P4 B& _) l' {7 J
}. W6 D6 [; [0 e" v+ p
void mexFuncTIon(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
* g3 ?7 C, w7 p{) K+ z n( z4 l% [
double *x, *y;+ W9 X( f) g. A% X) G9 y
int mrows, ncols;
/ c4 s% ^) e* W& h1 b% b% e: R! ^/*检查正确的参数数目*/2 i: r S0 |2 z) r' @
if(nrhs!=1){( v/ T5 w1 h" G1 [ G# M( j3 Z- P# c
mexErrMsgTxt("需要一个输入参数.");
" F, [& z J& R}
* I. w$ t4 W: uelse if(nlhs>1){) ~ d; ?3 x& }% }' n
mexErrMsgTxt("输出参数太多.");
. [7 ~; ]) s3 v _8 z, B}
# O( Q# {! o- {: h( {/*输入变量必须是非复数类型的标量*/
. f7 U+ L* i1 j7 ?! Vmrows=mxGetM(prhs[0]);) R2 c! e; G0 F) `3 ?
ncols=mxGetN(prhs[0]);
" ?/ E4 h1 j7 d& ]8 O, sif(!mxIsDouble(prhs[0]) || mxIsComplex(prhs[0]) || !(mrows==1 && ncols==1)){
" f+ j z n6 D9 @& R9 GmexErrMsgTxt("输入变量必须是非复数类型的标量.");
. Y) Z i: y: _) g$ X' G}! O; w E* N9 N. E8 B
/*为返回参数创建矩阵*/" \4 J; g8 J6 r- ?$ m) C1 e `9 @
plhs[0]=mxCreateDoubleMatrix(mrows, ncols, mxREAL);
6 B) Z! q$ h4 k/ S# d! u/*分配输入输出参数的指针*/- I3 \+ r4 b8 ]" Z' F! {
x=mxGetPr(prhs[0]);
; g* L8 r, E% T, X: u2 oy=mxGetPr(plhs[0]);
* ?6 b% g5 S) k& R: \' x; L% @( j/*调用TImestwo子函数*/
2 [' G* D0 A' q6 ?- k6 C( ttimestwo(y, x);1 B3 w# Y/ f3 _$ W, B: o
}
% P6 @/ a' a) C& }3 i. i8 n, _C语言是在编译的时候检查函数参数。MATLAB可以在M函数中传递任意数量和类型的参数,MEX文件也是如此,不过在程序中必须可靠地处理输入输出参数的数目。如果将上面的MEX文件命名为timestwo.c,就可以对它进行编译和链接,在MATLAB命令窗口下输入:
7 m' T1 a! ~& R, _! }3 D9 U6 Pmex timestwo.c 9 v# |0 b, |* n
这是产生MEX文件timestwo.***所必需的步骤,该文件的扩展名所运行的系统平台的类型。Windows系统下,扩展名为dll。此时,就可以象调用M函数一样调用timestwo了。
5 H8 ]6 t! D' p$ d# i9 Y% ?在MATLAB命令窗口中输入:
/ W5 l1 p' L+ Z: [% E5 ]x=2;
2 L$ A, w! _6 V) g) _" F; |y=timestwo(x);
1 x! k- c3 R. h1 m- R! b9 e就可以得到:
. ?) c0 O3 q2 m' g( S3 Wy=4;
* N# f% Q% u+ M$ }% P& D, b四、小 结
u/ t: m0 Z+ R3 V" F- h6 {MEX文件虽然具有较强大的功能,但并不是对所有的应用都恰当。MATLAB是一个高效率的编程系统,特别适合于工程计算、系统仿真等应用。它的最大优点就是将人们从繁杂的程序中解放出来。因此,能够用M文件完成的程序,应尽量使用MATLAB编写,除非遇到必须使用MEX文件的情况。
/ ^" k: x0 ?3 R! D4 @MATLAB的应用编程接口是一个功能强大的系统,除了调用C或Fortran程序,还可以实现从MATLAB环境中输入输出数据、在MATLAB中和其他程序建立客户/服务器关系等功能。 2 q, \0 [; [4 g
8 l- W7 _6 ^" q( [3 j3 @1 _. O& B |