EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
Matlab与C语言的应用接口程序 + {; ]& n0 o5 Z/ D" a6 z4 t2 P) `
、理解几个常用的socket函数
, G# x4 D) ], z2 [" b Z5 h #include ' U$ I0 y8 L8 [# S1 G% T
#include
; l7 X. S! L+ l2 I0 ]9 z2 [" `9 `int socket(int domain,int type,int portocol); , f5 \0 g5 x! j
domain指所使用的协议族(family)可以为AF_UNIX和AF_INET,一般只用AF_INET(指Internet)type指所用的传输类型,可以为SOCK_STERAM(面向连接的TCP),和SOCK_DGRAM(面向无连接的udp)
# Y1 V6 [ t; {# a# r7 n. Wint bind(int s,const struct sockaddr *address,size_t address_len); : h# O5 @6 f0 N$ d7 s# W$ X
s为socket返回的文件描述符
1 j* V* a9 J) p! f/ m8 [address为协议族名称和其他信息 + V6 k$ c* ~& t3 s$ r
具体结构为struct sockaddr_in{ / g8 m3 c0 K, f, t* q3 g
short sin_family;/*协议族 2 \0 L+ b8 o7 d) \/ A+ N
u_short sin_port;/*端口*/
: Z# y1 C4 ^' D* C- H; mstruct in_addr sin_addr;/*地址*/
; j3 O/ ~( x) Jchar sin_zero[8];
8 p2 ~! g3 H. y) U) Y& D: h* i1 @};" N# x) C; x' ?. G
int listen(int s,int backlog);
" m& ?5 B; y$ g& {1 b/ L. Z& x3 gbacklog为容许的请求数目
9 S1 b/ V! Y. H+ z g. {5 Jint accept(int s,struct sockaddr *address,int *address_len);7 b8 Q$ W! E. r" D! E' w
这里的前两个参数同上
/ s$ V! n! i) i5 e# q9 l3 n+ p% Oaddres_len是要传递一个记有结构大小的地址5 }9 B' D* j8 c3 e3 H
int connect(int s,struct sockaddr *address,size_t address_len);/ B/ `- O5 ]' ^3 L( k; O
这里的参数意义同bind
0 h$ K1 ^2 j1 x* J2.理解建立程序的一般调用过程 6 S" r: A4 |3 j. V
要建立一个处理连接的服务器端程序,首先要调用socket函数创建一个socket,返回一个文件句柄fd,使以后对它的操作就象对普通文件设备一样读写。
O' e% {# V- ^ c5 G, v由于是服务器端必须对一个断口进行监听其他机器的请求,所以接下去调用bind函数,传入刚才的fd,定义好地址和端口,由于是要接受来自任何host的连接所以应讲sin_addr赋为INADDR_ANY,port为你所设定的端口。
, ]' n/ n) m7 }+ t H- v注意:这里的地址和端口是网络字节顺序,所以要调用htonl,htons完成主机字节顺序
, v1 ~. O8 U4 `9 r到网络字节的转变 " M, F9 N: ~# s h" @0 @
接下来就是监听listen,调用accept接受来自客户端的请求,accpet返回连接后的文件描述符,你就可以用它进行收发信息(对应于read,write)这样的一个过程就是socket->bind->listen->accpet->Read,write
5 P' m: g$ F) } f& C4 L而对于客户端则是socket->connect->read,write " j6 a8 {! W! g" v# T3 Q
三、C语言程序MEX文件实例 7 r8 w1 L) H- h" c5 v
MATLAB 5 API提供了一系列程序来处理MATLAB所支持的各种数据类型,每一种数据类型都有对应函数共你使用来处理对应的数据。下面给出一个简单的C语言程序和与之对应的MEX文件代码,该程序的功能是将标量x加倍。 : v8 p' a. P% N# h' M4 N
#include "math.h": ~1 h' F' I8 G1 _+ T: R! G9 f% M% k
void TImestwo(double y[], double x[])
1 _/ f; c7 y [$ @% L1 t @5 D1 j! M{: h$ P5 T$ V1 P2 i+ z X3 [; X
y[0]=2.0*x[0];( k( O5 J0 m- C8 {* W. B$ g( k
return;" F/ s+ T% T, S" e( X3 L
} $ b9 _8 X' M0 a! R' r4 ^
下面是与C语言程序功能相同的MEX文件:9 R' R; ^* _1 h: J+ g
#include "mex.h"5 e, ]4 G7 }4 y
void TImestwo(double y[], double x[])
. Y+ E% L3 c- i, D{
8 h7 L: D% `4 a9 r& I9 z+ Ry[0]=2.0*x[0];9 W2 j2 v: w7 U
}( l3 |# Q/ V3 M9 c8 [# d5 R
void mexFuncTIon(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
2 }. o) p( o1 h2 z D) M2 W4 x/ G{% M: ^* A% {6 P; v
double *x, *y;
$ G5 l) J" V6 _3 j S$ U, Aint mrows, ncols;4 k* T1 ~/ ^6 w y0 U4 q6 Y
/*检查正确的参数数目*/7 u- S( ]& V) H" R1 D" ?4 I
if(nrhs!=1){" H: [/ G; n7 @7 f
mexErrMsgTxt("需要一个输入参数.");
8 |0 J: l) e" A- h( E! P9 A}
0 {$ Z; `! {' H2 X* relse if(nlhs>1){
+ _% J; g" R( Y: D4 }$ H0 {mexErrMsgTxt("输出参数太多.");
( F2 a8 u3 V6 t$ Y) }- x# a}/ X+ f" N' j6 g
/*输入变量必须是非复数类型的标量*/
$ ?! x. B' T8 X/ D" Z# E% Wmrows=mxGetM(prhs[0]);0 E" J5 ]3 s* }) e6 H, q+ H# s
ncols=mxGetN(prhs[0]);, \( U* A: ^: l {$ C& y! ^
if(!mxIsDouble(prhs[0]) || mxIsComplex(prhs[0]) || !(mrows==1 && ncols==1)){
7 t8 ~ p* e8 \4 J* amexErrMsgTxt("输入变量必须是非复数类型的标量.");$ R! D1 W# J7 G2 T: c b9 z* v# R
}
2 k+ B, a% f1 s5 ?* J+ u) D/*为返回参数创建矩阵*/# M% r& g! |8 ^
plhs[0]=mxCreateDoubleMatrix(mrows, ncols, mxREAL);
$ F. B6 i$ X1 O. T/*分配输入输出参数的指针*/
% ]$ F! Z" v3 \/ E, ?x=mxGetPr(prhs[0]);1 _8 f& u$ c$ V# ?
y=mxGetPr(plhs[0]);
* u e0 {$ s7 r: L7 g. U; |/*调用TImestwo子函数*/
- F; |5 b y( u0 C! M* Xtimestwo(y, x);
3 {9 D; M) P! m# W/ Y/ z5 p} ! F* R( _: Q) s8 p9 G3 R
C语言是在编译的时候检查函数参数。MATLAB可以在M函数中传递任意数量和类型的参数,MEX文件也是如此,不过在程序中必须可靠地处理输入输出参数的数目。如果将上面的MEX文件命名为timestwo.c,就可以对它进行编译和链接,在MATLAB命令窗口下输入:
4 B; D, O7 Q- \* Kmex timestwo.c
/ P) P4 G6 M) j% ?- u( A这是产生MEX文件timestwo.***所必需的步骤,该文件的扩展名所运行的系统平台的类型。Windows系统下,扩展名为dll。此时,就可以象调用M函数一样调用timestwo了。
/ y m( j( W& r% R在MATLAB命令窗口中输入:
$ n* C: Z2 `1 u* j% @x=2;! } Q. O, T1 I3 @# z1 I6 s( F
y=timestwo(x);
4 A) [7 \4 U3 K; a0 p就可以得到:( i9 S, N/ \% {5 ]
y=4;
. E8 @7 f( i: h- |* T H0 w/ ^6 n四、小 结
1 f0 ^7 c& y% c IMEX文件虽然具有较强大的功能,但并不是对所有的应用都恰当。MATLAB是一个高效率的编程系统,特别适合于工程计算、系统仿真等应用。它的最大优点就是将人们从繁杂的程序中解放出来。因此,能够用M文件完成的程序,应尽量使用MATLAB编写,除非遇到必须使用MEX文件的情况。
' V `- \# {8 J- m$ [+ }; [/ jMATLAB的应用编程接口是一个功能强大的系统,除了调用C或Fortran程序,还可以实现从MATLAB环境中输入输出数据、在MATLAB中和其他程序建立客户/服务器关系等功能。
/ C4 u8 q4 e# i1 c: U
2 P: Z- l+ P4 U* Y- ]3 n |