- 论坛徽章:
- 15
|
本帖最后由 yulihua49 于 2011-07-07 16:11 编辑
回复 yulihua49
有没有例子让我参考参考,谢谢!
mikzh 发表于 2011-07-07 15:11 ![]()
这是我的包头:- #define HEADPACKLENGTH 48
- #define PARANUM 9
- #define PROTO_NUM para[0] /*协议号:
- 客户呼叫服务器时是调用号,
- 服务器返回时是事件号,1-65535 */
- #define ERRNO1 para[1] /*主错误码 */
- #define ERRNO2 para[2] /*辅助错误码 */
- #define PKG_REC_NUM para[3] /*数据记录数 */
- #define PKG_LEN para[4] /*数据包长度 */
- #define T_LEN para[5] /* 传输长度 */
- #define O_NODE para[6] /*原结点地址*/
- #define D_NODE para[7] /*目的结点描述*/
- #define PKG_CRC para[8] /*数据包CRC */
- typedef struct { /*协议头 */
- u_int para[PARANUM];
- char *data;
- } T_NetHead;
复制代码 9个整数共36字节。转化成BASE64,变成48字节。因此,我的包头是固定长度48字节。
接收端按固定长度48先收包头。
然后根据T_LEN收数据。- int RecvNet(int s,char *buf,int n,int timeout)
- {
- int bcount,br,ret,num=0;
- struct timeval tmout;
- if(!buf) return 0;
- tmout.tv_sec=timeout;
- tmout.tv_usec=0;
- ret=setsockopt(s,SOL_SOCKET,SO_RCVTIMEO,(char *)&tmout,sizeof(tmout));
- *buf=0;
- if(n<=0) return 0;
- bcount=0;
- br=0;
- num=0;
- while(bcount<n){
- if((br=read(s,buf,n-bcount))>0){
- bcount+=br;
- buf+=br;
- continue;
- }
- if(br<0){
- if(errno==11) return TIMEOUTERR;
- ShowLog(1,"%s:br=%d,err=%d,%s",__FUNCTION__,br,errno,strerror(errno));
- return -1;
- }
- if(!br ) {
- if( ++num>100) break;
- usleep(5000);
- continue;
- } else num=0;
- }
- if(bcount<=0) {
- ShowLog(1,"%s:bcount=%d,err=%d,%s",__FUNCTION__,bcount,errno,strerror(errno));
- return -1;
- }
- return bcount;
- }
复制代码 参数n就是要收的数据。如果读的不够数,就不断的读,直到够数或超时。 |
|