接收數據在子進程中:
char data_buffer[BUFFER_SIZE];
char *ptr = "";
int data_len = 0;
int pre_len = 0;
for (;;)
{
bzero(data_buffer, BUFFER_SIZE);
int length = recv(client_data_socket, data_buffer, BUFFER_SIZE, 0);
if (length == 0)
{
close(client_data_socket);
break;
}
else if (length < 0)
{
if (errno == EAGAIN || errno == EWOULDBLOCK || errno == EINTR)
{
continue;
}
close(client_data_socket);
printf("get data failed\n");
exit(1);
}
pre_len = data_len;
data_len += length;
char *tmp_ptr = (char *)calloc(data_len, sizeof(char));
memcpy(tmp_ptr, ptr, pre_len);
memcpy(tmp_ptr + pre_len, data_buffer, length);
if (pre_len > 0) free(ptr);
ptr = tmp_ptr;
}
char *tmp_ptr = (char *)calloc(data_len + 1, sizeof(char));
g2u(ptr, data_len, tmp_ptr, data_len + 1);
printf("%s\n", tmp_ptr);
free(ptr);
free(tmp_ptr);
exit(0);
g2u 方法是編碼轉換,把 gbk to utf-8 然后發(fā)現讀出來的數據少了一部分,我是在 recv 返回 0 的時候,判斷數據全部接收,可是發(fā)現結果有問題
顯然,迅雷下載這幾個字,沒接收完(不知道哪里出了問題) 真正的文件列表
打印了一下接收到的字節(jié)
..... 32 32 -47 -72 -64 -41 -49 -62 -44 -40 13 10
32 是空格,13 是\r 10 是\n -47 -72 -64 -41 -49 -62 -44 -40 這一段我用 vc 打印了一下,正好是迅雷下載
看來是 g2u 函數的問題
然后我再看了看,把把outbuf放大(改成了2倍,outlen的值也要改),就可以正確輸出了
看來是多字節(jié)對應漢字的問題
GBK編碼,一個漢字占兩個字節(jié) UTF-8編碼是變長編碼,通常漢字占三個字節(jié),擴展B區(qū)以后的漢字占四個字節(jié)。
北大青鳥APTECH成立于1999年。依托北京大學優(yōu)質雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數據專業(yè)的國家
達內教育集團成立于2002年,是一家由留學海歸創(chuàng)辦的高端職業(yè)教育培訓機構,是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
北大課工場是北京大學校辦產業(yè)為響應國家深化產教融合/校企合作的政策,積極推進“中國制造2025”,實現中華民族偉大復興的升級產業(yè)鏈。利用北京大學優(yōu)質教育資源及背
博為峰,中國職業(yè)人才培訓領域的先行者
曾工作于聯想擔任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔任項目經理從事移動互聯網管理及研發(fā)工作,曾創(chuàng)辦藍懿科技有限責任公司從事總經理職務負責iOS教學及管理工作。
浪潮集團項目經理。精通Java與.NET 技術, 熟練的跨平臺面向對象開發(fā)經驗,技術功底深厚。 授課風格 授課風格清新自然、條理清晰、主次分明、重點難點突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網頁制作和網頁游戲開發(fā)。
具有10 年的Java 企業(yè)應用開發(fā)經驗。曾經歷任德國Software AG 技術顧問,美國Dachieve 系統(tǒng)架構師,美國AngelEngineers Inc. 系統(tǒng)架構師。