static void echo_client(ACL_FIBER *fiber, void *ctx) { ACL_VSTREAM *cstream = (ACL_VSTREAM *) ctx; char buf[8192]; int ret, count = 0; int ntimeout = 0; FIBER_TIMER *ft = (FIBER_TIMER *) acl_mymalloc(sizeof(FIBER_TIMER)); ft->fiber = fiber; ft->timer = acl_fiber_create_timer(__rw_timeout * 1000, 320000, io_timer, ft); ft->conn = cstream; #define SOCK ACL_VSTREAM_SOCK while (1) { printf("begin read\n"); ret = acl_vstream_gets(cstream, buf, sizeof(buf) - 1); if (ret == ACL_VSTREAM_EOF) { printf("fiber-%d, gets error: %s, %d, %d, fd: %d, " "count: %d\r\n", acl_fiber_id(fiber), acl_last_serror(), errno, acl_fiber_errno(fiber), SOCK(cstream), count); if (errno != ETIMEDOUT) break; if (++ntimeout > 2) { printf("too many timeout: %d\r\n", ntimeout); break; } printf("ntimeout: %d\r\n", ntimeout); ft->timer = acl_fiber_create_timer(__rw_timeout * 1000, 320000, io_timer, ft); } acl_fiber_reset_timer(ft->timer, __rw_timeout * 1000); buf[ret] = 0; //printf("gets line: %s", buf); if (acl_vstream_writen(cstream, buf, ret) == ACL_VSTREAM_EOF) { printf("write error, fd: %d\r\n", SOCK(cstream)); break; } count++; } acl_myfree(ft); acl_vstream_close(cstream); }
static int socket_trunc(krb5_storage * sp, off_t offset) { if (ftruncate(SOCK(sp), offset) == -1) return errno; return 0; }
static int socket_sync(krb5_storage * sp) { if (fsync(SOCK(sp)) == -1) return errno; return 0; }
static void socket_free(krb5_storage * sp) { int save_errno = errno; if (rk_IS_SOCKET_ERROR(rk_closesocket(SOCK(sp)))) errno = rk_SOCK_ERRNO; else errno = save_errno; }
KRB5_LIB_FUNCTION krb5_storage * KRB5_LIB_CALL krb5_storage_from_socket(krb5_socket_t sock_in) { krb5_storage *sp; int saved_errno; krb5_socket_t sock; #ifdef _WIN32 WSAPROTOCOL_INFO info; if (WSADuplicateSocket(sock_in, GetCurrentProcessId(), &info) == 0) { sock = WSASocket( FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO, &info, 0, 0); } #else sock = dup(sock_in); #endif if (sock == rk_INVALID_SOCKET) return NULL; errno = ENOMEM; sp = malloc(sizeof(krb5_storage)); if (sp == NULL) { saved_errno = errno; rk_closesocket(sock); errno = saved_errno; return NULL; } errno = ENOMEM; sp->data = malloc(sizeof(socket_storage)); if (sp->data == NULL) { saved_errno = errno; rk_closesocket(sock); free(sp); errno = saved_errno; return NULL; } sp->flags = 0; sp->eof_code = HEIM_ERR_EOF; SOCK(sp) = sock; sp->fetch = socket_fetch; sp->store = socket_store; sp->seek = socket_seek; sp->trunc = socket_trunc; sp->fsync = socket_sync; sp->free = socket_free; sp->max_alloc = UINT_MAX/8; return sp; }
int main(void) { BYTE nI; LED_Init(); USART1_Config(); //串口初始化 WT_GPIO_Config(); //控制WT1000的IO引脚初始化 AMBEReset(); //复位WT1K和WT1027 SOCK(0); SOSTRB(1); PD2(0); //串行模式下PD2必须下拉或者接地 pFrameData[0] = 0x13; pFrameData[1] = 0xec; for(nI = 2; nI < 34; nI++) { pFrameData[nI] = 0; //初始化pFrameData数组 } while(!EPR); AMBEReadSerial(); while(1) { LED0=~LED0; while(!EPR); //读EPR信号 AMBEReadSerial(); //串行读WT1K编码数据 LoadreadBUF(); //将独到的语音编码数据放到发送缓冲区pTXBUF中 UART1SendData(pTXBUF,VOICELENGTH+2); //串口发送 while(!DPE); //读DPE信号 if(bReceived ==1) //串口中断接收到一包完整的数据bReceived=1;收到的数据放在接收缓冲区pRXBUF { noReceived=0; LoadFrame(); //将接收缓冲区pRXBUF的语音数据移到pFrameData中 AMBEWriteSerial(); //串行写WT1K bReceived = 0; } else { noReceived++; if(noReceived==4) //连续4包没收到完整数据向WT1K写静音数据 { noReceived=3; LoadNoVoice(); AMBEWriteSerial(); } } } }
static off_t socket_seek(krb5_storage * sp, off_t offset, int whence) { return lseek(SOCK(sp), offset, whence); }
static ssize_t socket_store(krb5_storage * sp, const void *data, size_t size) { return net_write(SOCK(sp), data, size); }
static ssize_t socket_fetch(krb5_storage * sp, void *data, size_t size) { return net_read(SOCK(sp), data, size); }