|
皆様返信ありがとうございます。
現在サーバのソケットから一行受信する関数を作っていて上記のような悩みがでてきました。
main()関数内で char *buf;と宣言し、socRecvOneLine(soc, &buf);と呼びだします。
int socRecvOneLine(int soc, char **ret_buf) {
char *tmpbuf;
int len, str_len, pos;
char *cp;
*ret_buf = NULL;
/* 初期メモリとして1024byte確保 */
tmpbuf = (char *)calloc(1, sizeof(char));
if (tmpbuf == NULL) {
perror("calloc");
return -1;
}
pos = 0;
while (1) {
len = recv(soc, tmpbuf+pos, 1, 0);
if (len <= 0) {
perror("recv");
free(tmpbuf);
return -1;
}
if ( (cp = strstr(tmpbuf, "\r\n")) != NULL) {
*cp = '\0';
break;
}
while (len--) pos++;
tmpbuf = (char *)realloc(tmpbuf, 1);
if (tmpbuf == NULL) {
perror("realloc");
free(tmpbuf);
return -1;
}
}
str_len = strlen(tmpbuf);
*ret_buf = tmpbuf;
return str_len;
}
上記の関数のままだと、毎回この関数を呼ぶたびに開放されてない領域が増えていくと思いますが、、、。
なにかいい方法はないでしょうか。
|