异步网络传输模式,分两个层面
A)使用非阻塞socket
sockfd=socket(AF_INET,SOCK_STREAM,0); /* 设置socket缓冲区 */ size=65535; ret=setsockopt(sockfd,SOL_SOCKET,SO_SNDBUF,&size,sizeof(size)); size=65535; ret=setsockopt(sockfd,SOL_SOCKET,SO_RCVBUF,&size,sizeof(size)); /* 设置非阻塞socket */ #ifndef WIN32 # ifdef MY_HPUX jet = fcntl(sockfd,F_SETFL,O_NONBLOCK); # else jet = fcntl(sockfd,F_SETFL,O_NDELAY); # endif #else { DWORD flag = 1; jet = ioctlsocket(sockfd, FIONBIO, &flag); } #endif/**********win32*************/ jet = connect(sockfd,(struct sockaddr *)&cen_addr,sizeof(cen_addr));
B)异步数据处理模式
定义发送、接收控制索引及数据缓冲区
typedef struct rcv_buf_ctrl { short needRcvLen; } RCVBUFCTRL; char *RcvBuf; typedef struct snd_buf_ctrl { short needSndLen; } SNDBUFCTRL; char *SndBuf;
控制索引及数据缓冲区原则:
1)能发送就发送,不能发送也不能强求,将需要发送的数据先寄存到SndBuf中;
下次发送前,首先发送SndBuf中的数据
2)能接收就接收,不能接收就通过select(,readfds,,,timeout)来检测socket可读,然后再接收;
下次接收前,首先要接收上次预期的数据
备注:
异步网络传输模式,在以下两种情况下非常有效:
1)低带宽环境
2)普通带宽环境,但单次发送的数据量比较大,如32K