EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
Matlab与C语言的应用接口程序 / l' q+ ^! ^0 B; Y2 e
、理解几个常用的socket函数7 H- `/ B' U/ s% M
#include
6 C4 t& E0 I# r#include : q% ~: j8 i% g; I! {! E4 B; S8 x
int socket(int domain,int type,int portocol); 7 l1 u; o" V/ ^( p) b4 E7 F
domain指所使用的协议族(family)可以为AF_UNIX和AF_INET,一般只用AF_INET(指Internet)type指所用的传输类型,可以为SOCK_STERAM(面向连接的TCP),和SOCK_DGRAM(面向无连接的udp) : c- y! N/ c4 C( r8 e5 K4 h, c
int bind(int s,const struct sockaddr *address,size_t address_len);
/ N) {+ x3 ^$ Is为socket返回的文件描述符
5 D5 {1 c0 J5 k0 V$ laddress为协议族名称和其他信息
! Y4 c/ ]% `" x9 X/ ^* _2 B具体结构为struct sockaddr_in{ / [1 Q- G3 Y6 h; m: U% g1 V1 d' k
short sin_family;/*协议族
3 `$ S8 D& Z, K7 W8 E* e0 e2 ju_short sin_port;/*端口*/, R. o' }: B" H7 ]
struct in_addr sin_addr;/*地址*/ i! X3 M4 W% f' Q1 a0 D B
char sin_zero[8];: R4 \, W- P: i7 s1 B0 v
};! }, E3 a, v: z5 y' S: O: P
int listen(int s,int backlog);
+ P, ~( A6 r- |4 {+ ?backlog为容许的请求数目- I5 O7 d9 \7 j: @) d1 g' m
int accept(int s,struct sockaddr *address,int *address_len);: j, q/ o$ e* \2 p: L6 m* Q- x
这里的前两个参数同上8 q) o5 D4 ]. ?& b
addres_len是要传递一个记有结构大小的地址
+ w8 G9 o ?- ^& v$ ~/ {5 K& Yint connect(int s,struct sockaddr *address,size_t address_len);. {& l3 @/ T2 B, W' u
这里的参数意义同bind
" |. o4 M4 S; s b1 C/ r/ E4 b2.理解建立程序的一般调用过程 3 J+ G+ S5 l3 T
要建立一个处理连接的服务器端程序,首先要调用socket函数创建一个socket,返回一个文件句柄fd,使以后对它的操作就象对普通文件设备一样读写。
$ a6 V' c4 z' L* H; L* k9 w由于是服务器端必须对一个断口进行监听其他机器的请求,所以接下去调用bind函数,传入刚才的fd,定义好地址和端口,由于是要接受来自任何host的连接所以应讲sin_addr赋为INADDR_ANY,port为你所设定的端口。
' q, ~/ }5 [, T+ J8 r! N注意:这里的地址和端口是网络字节顺序,所以要调用htonl,htons完成主机字节顺序
7 L r: n) D9 L K* h4 I* D# K到网络字节的转变 d J* n ], |3 n O6 i8 ^
接下来就是监听listen,调用accept接受来自客户端的请求,accpet返回连接后的文件描述符,你就可以用它进行收发信息(对应于read,write)这样的一个过程就是socket->bind->listen->accpet->Read,write( v/ c* O N: O; i& o
而对于客户端则是socket->connect->read,write
# e8 T# T' z2 a2 Z" n& t, c三、C语言程序MEX文件实例
3 E8 T2 o+ L0 W W/ s, E( {MATLAB 5 API提供了一系列程序来处理MATLAB所支持的各种数据类型,每一种数据类型都有对应函数共你使用来处理对应的数据。下面给出一个简单的C语言程序和与之对应的MEX文件代码,该程序的功能是将标量x加倍。 ' n2 B2 K/ Q* q5 b W
#include "math.h" m) s- x7 r( n% x% R
void TImestwo(double y[], double x[])
* v' F7 ]5 C/ I- e4 ^( j. r7 o{: d ]. k& S( K `% H6 F c
y[0]=2.0*x[0];$ }! e. G5 N& s0 k7 ^& t" o
return;. u4 M L' X! q0 j3 I$ y
}
6 v# e, P9 X) C下面是与C语言程序功能相同的MEX文件:& W* _% _3 S$ k* O3 N9 m5 D# R
#include "mex.h"
, C& S* D' }2 d9 o1 f: qvoid TImestwo(double y[], double x[])* P8 S$ g1 `6 v' d2 S8 l
{6 u7 G! _2 ~8 n' k& v! q
y[0]=2.0*x[0];
0 \7 h+ R! k5 U0 {}
9 Z) y# e" ?/ T; P! Y, J+ Dvoid mexFuncTIon(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])" N. @& B2 C2 \ _1 X; L7 r
{4 ^& a s7 n: Q9 X* ~4 p
double *x, *y;
* C- Z9 o8 ]5 G+ k4 \5 ^8 nint mrows, ncols;1 m3 i4 s% L: O9 I
/*检查正确的参数数目*/
6 K7 E$ `7 ]! z Zif(nrhs!=1){
6 C& O6 A0 Q+ R2 \$ ZmexErrMsgTxt("需要一个输入参数.");
G' j0 H) f/ y1 n3 S}
5 t3 i! h1 Q. ?! p! @+ R) X9 lelse if(nlhs>1){
3 k+ e1 E& I& e8 ZmexErrMsgTxt("输出参数太多.");2 j3 B4 G# m( L: \) p
}
0 r0 z3 {, T* q) L" G. M2 _/*输入变量必须是非复数类型的标量*/
8 s- U# D% C9 b$ m2 |mrows=mxGetM(prhs[0]);
; P; ?- B# W& V8 {% h+ H# Uncols=mxGetN(prhs[0]);& h$ H1 e: Z2 ~ F
if(!mxIsDouble(prhs[0]) || mxIsComplex(prhs[0]) || !(mrows==1 && ncols==1)){
4 v, G5 B5 T0 O H: R; |2 GmexErrMsgTxt("输入变量必须是非复数类型的标量.");7 s" J# q5 ]6 O# l+ ?. V& K, M
}- Y9 \. o: x( z, E
/*为返回参数创建矩阵*/5 M* \8 A' l/ l( F( f0 i
plhs[0]=mxCreateDoubleMatrix(mrows, ncols, mxREAL);. C8 A- z3 g' K6 B9 }! y9 y8 P
/*分配输入输出参数的指针*/, d5 I# O, ^! D. @1 k/ t2 [
x=mxGetPr(prhs[0]);
1 F, C* w5 ]) v6 Vy=mxGetPr(plhs[0]);! P4 M4 u4 A) g% ?: D6 w* L
/*调用TImestwo子函数*/
- Z# j; ]0 v1 g! R% @% jtimestwo(y, x);
' j) K& y: }/ H" }! O}
- Q: v( h) A. [0 TC语言是在编译的时候检查函数参数。MATLAB可以在M函数中传递任意数量和类型的参数,MEX文件也是如此,不过在程序中必须可靠地处理输入输出参数的数目。如果将上面的MEX文件命名为timestwo.c,就可以对它进行编译和链接,在MATLAB命令窗口下输入:
8 W; n i+ F. W# F5 Z7 w' Z- J- zmex timestwo.c 9 y7 f) R) b0 r6 a
这是产生MEX文件timestwo.***所必需的步骤,该文件的扩展名所运行的系统平台的类型。Windows系统下,扩展名为dll。此时,就可以象调用M函数一样调用timestwo了。9 P! N2 M9 o- u* \7 o1 v) c
在MATLAB命令窗口中输入:
; R3 Q* Y/ X4 ?* E7 c1 d: |7 Z# px=2;
7 r2 O. x$ e6 r' v# O. my=timestwo(x);
. v. D# b5 E' @( M8 e8 b就可以得到:& C# _" F# j6 `. F$ [
y=4;
% R& L$ O' U; w$ f四、小 结
6 o, J+ j+ W1 RMEX文件虽然具有较强大的功能,但并不是对所有的应用都恰当。MATLAB是一个高效率的编程系统,特别适合于工程计算、系统仿真等应用。它的最大优点就是将人们从繁杂的程序中解放出来。因此,能够用M文件完成的程序,应尽量使用MATLAB编写,除非遇到必须使用MEX文件的情况。 ) q' `- M4 L E* I" M$ M- H
MATLAB的应用编程接口是一个功能强大的系统,除了调用C或Fortran程序,还可以实现从MATLAB环境中输入输出数据、在MATLAB中和其他程序建立客户/服务器关系等功能。
0 v8 s7 {5 q' N7 x( M8 \2 K/ ]; ~7 B [! x! n, _
|