tcp接收recv每次只接收1个字节,有什么好处吗? 本帖最后由 VisualEleven 于 2011-01-12 11:32:17 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 char *ami_sock_receive_internal(int sock, int wait_for_an_action_reply){ char *resp = NULL; char *reall = NULL; char c; int buffLen = 0; int i = 0; int bytes; int total = 0; if(sock <= 0){ return NULL; } resp = (char *)malloc(sizeof(char) * AMI_MAX_BUFFER); buffLen = AMI_MAX_BUFFER; if(!resp){ return NULL; } resp[0] = '\0'; while(1){ switch (ami_sock_readable(sock,250)) { case -1: free(resp); return NULL; case 0: continue; default: break; } bytes = recv(sock,&c,1,0); if(bytes <= 0 && total <= 0){ free(resp); return NULL; }else if(bytes <= 0){ break; }else{ total += bytes; } if(i >= (buffLen - 1)){ reall = (char *)realloc((void *)resp,(buffLen + AMI_MAX_BUFFER)); if(!reall){ free(resp); return NULL; } resp = reall; reall = NULL; buffLen += AMI_MAX_BUFFER; } resp[i] = c; resp[i+1] = '\0'; if(c == '\n' && i >= 3){ if(resp[i-3] == '\r' && resp[i-2] == '\n' && resp[i-1] == '\r' && resp[i] == '\n'){ resp[i-1] = '\0'; /* Is this packet an Event packet which isn't part of an action ? */ if (!strncmp(resp, "Event:", 6)) { if (!strstr(resp, "ActionID: ami_")) { if (event_cb_func) { ast_packet *packet = ami_parse_packet(resp); if (!packet) {#ifdef _AMI_DEBUG printf("Unable to parse event: %s\n", resp);#endif } else { event_cb_func(packet, event_cb_data); ami_destroy_packet(packet); } } free(resp); if (!wait_for_an_action_reply) { return NULL; } i = 0; resp = (char *)malloc(sizeof(char) * AMI_MAX_BUFFER); buffLen = AMI_MAX_BUFFER; if(!resp){ return NULL; } resp[0] = '\0'; continue; } } break; } } else if (i == 1) { if (resp[i-1] == '\r' && resp[i] == '\n') { resp[0] = '\0'; break; } } i++; } if(!strlen(resp)){ free(resp); return NULL; } return resp;} 没什么好处,只是省去了接受缓充区.用CPU换取了一点点空间. SDK 改变窗口图标(不用资源文件) tcp 数据 查找关键字 关于CCmdTarget::OnCmdMsg这个函数帮我理解一下 windows编程和JAVA编程哪个更该先学? 为什么这人程序杀不死瑞星进程!怎么样才可以? 查询问题 关于SPI 笑一飞快进来!! 那位大哥知道超星文间格式怎样转换成文本文件?200分 如何防止程序按ESC退出? 请教 关于对话框已经上面的控件
char *resp = NULL;
char *reall = NULL;
char c;
int buffLen = 0;
int i = 0;
int bytes;
int total = 0;
if(sock <= 0){ return NULL; }
resp = (char *)malloc(sizeof(char) * AMI_MAX_BUFFER);
buffLen = AMI_MAX_BUFFER;
if(!resp){ return NULL; }
resp[0] = '\0';
while(1){
switch (ami_sock_readable(sock,250)) {
case -1:
free(resp);
return NULL;
case 0:
continue; default:
break;
}
bytes = recv(sock,&c,1,0);
if(bytes <= 0 && total <= 0){
free(resp);
return NULL;
}else if(bytes <= 0){
break;
}else{
total += bytes;
}
if(i >= (buffLen - 1)){
reall = (char *)realloc((void *)resp,(buffLen + AMI_MAX_BUFFER));
if(!reall){
free(resp);
return NULL;
}
resp = reall;
reall = NULL;
buffLen += AMI_MAX_BUFFER;
}
resp[i] = c;
resp[i+1] = '\0';
if(c == '\n' && i >= 3){
if(resp[i-3] == '\r' && resp[i-2] == '\n' && resp[i-1] == '\r' && resp[i] == '\n'){
resp[i-1] = '\0';
/* Is this packet an Event packet which isn't part of an action ? */
if (!strncmp(resp, "Event:", 6)) {
if (!strstr(resp, "ActionID: ami_")) {
if (event_cb_func) {
ast_packet *packet = ami_parse_packet(resp);
if (!packet) {
#ifdef _AMI_DEBUG
printf("Unable to parse event: %s\n", resp);
#endif
} else {
event_cb_func(packet, event_cb_data);
ami_destroy_packet(packet);
}
}
free(resp);
if (!wait_for_an_action_reply) {
return NULL;
} i = 0;
resp = (char *)malloc(sizeof(char) * AMI_MAX_BUFFER);
buffLen = AMI_MAX_BUFFER;
if(!resp){ return NULL; }
resp[0] = '\0';
continue;
}
}
break;
}
} else if (i == 1) {
if (resp[i-1] == '\r' && resp[i] == '\n') {
resp[0] = '\0';
break;
}
}
i++;
}
if(!strlen(resp)){
free(resp);
return NULL;
}
return resp;
}