EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
理解几个常用的socket函数 #include
( ]' C/ x! N; p, `" u& K0 H2 R#include
9 Y7 m3 o7 j5 zint socket(int domain,int type,int portocol);
) H8 C! E$ I2 w2 odomain指所使用的协议族(family)可以为AF_UNIX和AF_INET,一般只用AF_INET(指Internet)type指所用的传输类型,可以为SOCK_STERAM(面向连接的TCP),和SOCK_DGRAM(面向无连接的udp)7 |# _$ ]+ ^% y$ ~: b
int bind(int s,const struct sockaddr *address,size_t address_len);
" Z, V8 a; z+ B0 L# y& as为socket返回的文件描述符
$ a/ z2 i( ]- o7 faddress为协议族名称和其他信息
4 O) |/ b* c7 b0 N: Y具体结构为struct sockaddr_in{
4 m" Q2 u/ ]" L7 k0 q k# Zshort sin_family;/*协议族
8 a$ o' Q% \6 c- x/ du_short sin_port;/*端口*/
% K+ h7 S9 }3 ]2 t% D! W* x8 istruct in_addr sin_addr;/*地址*/
% S! H* [8 M4 Q2 R# M3 fchar sin_zero[8];3 S. Y7 X/ d9 G2 W9 u' ~% U9 o
};- v, \ i. \2 Z. r D; `" r( X$ d
int listen(int s,int backlog);
" n {1 E8 ?! B. s% j% {3 ?4 Nbacklog为容许的请求数目6 @6 i. l# M! Z$ @! k
int accept(int s,struct sockaddr *address,int *address_len);
6 `* M/ m- G% ^这里的前两个参数同上$ g1 X4 U; Z) C. m2 T1 o. g4 M5 ]
addres_len是要传递一个记有结构大小的地址
+ Y% s' T, r4 `/ U- g2 `5 H# Oint connect(int s,struct sockaddr *address,size_t address_len);
4 O4 u% i* ^! z这里的参数意义同bind 2.理解建立程序的一般调用过程 要建立一个处理连接的服务器端程序,首先要调用socket函数创建一个socket,返回一个文件句柄fd,使以后对它的操作就象对普通文件设备一样读写。 由于是服务器端必须对一个断口进行监听其他机器的请求,所以接下去调用bind函数,传入刚才的fd,定义好地址和端口,由于是要接受来自任何host的连接所以应讲sin_addr赋为INADDR_ANY,port为你所设定的端口。 注意:这里的地址和端口是网络字节顺序,所以要调用htonl,htons完成主机字节顺序9 s: O. v% w+ |9 |0 w; C: F/ B. U
到网络字节的转变 接下来就是监听listen,调用accept接受来自客户端的请求,accpet返回连接后的文件描述符,你就可以用它进行收发信息(对应于read,write)这样的一个过程就是socket->bind->listen->accpet->Read,write
1 K# _. n( @+ O* s0 L& h( Y而对于客户端则是socket->connect->read,write 三、C语言程序MEX文件实例 MATLAB 5 API提供了一系列程序来处理MATLAB所支持的各种数据类型,每一种数据类型都有对应函数共你使用来处理对应的数据。下面给出一个简单的C语言程序和与之对应的MEX文件代码,该程序的功能是将标量x加倍。 #include "math.h"
* E" k E7 M8 Z# [/ gvoid timestwo(double y[], double x[])- e# p# D# d6 M" L1 l6 q
{/ c; u5 ~1 Z7 G
y[0]=2.0*x[0]; m$ x& _* P' f9 Z! y$ K
return;, ^1 L8 H- I5 L3 v% W
} 下面是与C语言程序功能相同的MEX文件:
u) ?5 f" U) f$ r#include "mex.h"% d' O( {. k2 {- [
void timestwo(double y[], double x[])
/ I+ `# \# X, A' B{
: B1 F# j! i g3 v% H0 `y[0]=2.0*x[0];
7 k) Z+ Z, p/ r" O$ j4 \3 o( P}9 r3 I @, S1 U- P t
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
: y; X4 S! i/ g- V9 ^{7 D7 j# C8 }6 s) Q. ]
double *x, *y;* K' C: U o: N; S& L/ X
int mrows, ncols;
. [8 F2 L7 k! @9 K/*检查正确的参数数目*/6 h, h. p! E m8 T3 x8 s, W0 H
if(nrhs!=1){
- s, }! D3 H l2 o& \mexErrMsgTxt("需要一个输入参数.");. C( ]" j0 I. _+ R$ J: }3 b
}
- M& W9 P" i( D: W2 K J+ _. belse if(nlhs>1){
- q0 _; Z% v+ i! s- xmexErrMsgTxt("输出参数太多.");; t& J5 h( f( n+ p( O
}6 w1 j& V; ~$ \
/*输入变量必须是非复数类型的标量*/, M3 `* t/ l1 |! ~& d6 x( ^3 b
mrows=mxGetM(prhs[0]);9 J# U* c8 X: G7 k3 I1 k" ]0 ]
ncols=mxGetN(prhs[0]);, f8 d3 G. O1 L: J7 d
if(!mxIsDouble(prhs[0]) || mxIsComplex(prhs[0]) || !(mrows==1 && ncols==1)){- S f5 G/ X L: s0 B8 u1 N
mexErrMsgTxt("输入变量必须是非复数类型的标量.");
x. n/ `& Q6 s. n9 x+ K+ _, V+ t}/ O" Q+ j6 x! u+ B
/*为返回参数创建矩阵*/6 } a% ]* f1 F$ \7 [) M
plhs[0]=mxCreateDoubleMatrix(mrows, ncols, mxREAL);
! v3 p7 C' M' Z4 D& s5 ]& F2 L/*分配输入输出参数的指针*/
& {! ~ z* ~0 F) ? ]. Ux=mxGetPr(prhs[0]);7 s- a( b0 b) X
y=mxGetPr(plhs[0]); g1 J0 T$ ^ L6 {2 Y
/*调用timestwo子函数*/; k/ h/ a* P6 f1 r
timestwo(y, x);, C; d6 I* m8 }* `* @* X
} C语言是在编译的时候检查函数参数。MATLAB可以在M函数中传递任意数量和类型的参数,MEX文件也是如此,不过在程序中必须可靠地处理输入输出参数的数目。如果将上面的MEX文件命名为timestwo.c,就可以对它进行编译和链接,在MATLAB命令窗口下输入:
3 M+ n5 T( Y: S3 Xmex timestwo.c 这是产生MEX文件timestwo.***所必需的步骤,该文件的扩展名所运行的系统平台的类型。Windows系统下,扩展名为dll。此时,就可以象调用M函数一样调用timestwo了。6 N8 [# Q* a0 }0 T
在MATLAB命令窗口中输入:
. N' K; k0 y7 r3 X; p- x# Fx=2;
/ G: j6 [% E4 ^2 t& ky=timestwo(x);2 }& Q- R+ e( R6 z
就可以得到:0 T. |6 Y8 I! k
y=4; 四、小 结 MEX文件虽然具有较强大的功能,但并不是对所有的应用都恰当。MATLAB是一个高效率的编程系统,特别适合于工程计算、系统仿真等应用。它的最大优点就是将人们从繁杂的程序中解放出来。因此,能够用M文件完成的程序,应尽量使用MATLAB编写,除非遇到必须使用MEX文件的情况。 MATLAB的应用编程接口是一个功能强大的系统,除了调用C或Fortran程序,还可以实现从MATLAB环境中输入输出数据、在MATLAB中和其他程序建立客户/服务器关系等功能。
: E1 t0 E' G8 d6 O/ y |