私のプログラムに問題があります。私は無限ループでstdinから読んでいます。うまくいきますが、4096文字以上の文字をstdinに入れると、それは悪い動作を始めます。本当になぜですか。 getcは制限されていますか?私は、私は、例えば、入力と出力DOR Ilustrationによってにここgetcが4096を超える文字を読み取るとエラーが発生します
#define NFDS 1
#define h_addr h_addr_list[0]
#define BUFFER_LEN 4096
void *sending(void *arguments)
{
struct arg_struct *args = arguments;
int i = 0, j = 1;
if(signal(SIGINT, receive_signal) == SIG_ERR) {
fprintf(stderr, "Error setting signal handler for SIGINT.\n");
}
fd_set myset;
struct timeval tim;
int result;
int data_cap = 4096;
while(running)
{
tim.tv_sec = 0;
tim.tv_usec = 500;
FD_ZERO(&myset);
FD_SET(STDIN_FILENO, &myset);
result = select(STDIN_FILENO + 1, &myset, NULL, NULL, &tim);
if(result != 0)
{
str = calloc(data_cap,sizeof(char));
while((c = getc(stdin)) != '\n')
{
if (j >= data_cap)
{
str = realloc(str,sizeof(char) * data_cap * 2);
data_cap = data_cap * 2;
}
str[i] = c;
i++;
j++;
}
if (j >= data_cap)
{
str = realloc(str,sizeof(char) * data_cap * 2);
}
str[i] = '\0';
if(strlen(str)!=0)
{
bufferIn = message(args->arg2,str);
if(send(args->arg1,bufferIn,strlen(bufferIn),0) < 0)
{
callError("ERROR: cannot send socked");
}
free(bufferIn);
}
free(str); i = 0; j = 1; data_cap = 4096;
}
}
return NULL;
}
//in main threads
struct arg_struct args;
args.arg1 = client_socket;
args.arg2 = username;
pthread_t t22;
pthread_t t11;
pthread_create(&t22, NULL, &sends, (void *)&args);
pthread_create(&t11, NULL, &reci, (void *)&args);
pthread_join(t22, NULL);
pthread_cancel(t22);
pthread_join(t11, NULL);
pthread_cancel(t11);
入力をあなたを配置します:aaaaaaaaを..... aaaaaaaaaこれは、シーケンス内の4096「」文字があることを想像することができますWORD
IS 「」「」 を最後から最初が、私はこれを取得する標準入力から得たもの印刷するとき:
これはWORD AAAAAAA IS ......これはWORD
何ですかAAAAAAAそれは本当に最初です、それはすべての文字を読むf orm 4096. char。この例では、これは「これは言葉です」と最初に印刷します。最初の場所で印刷すべきものを実際に印刷するよりも。
行末にない文字の間には、最初に があります。私は4096バイトでmamoryを配置しているため、メモリ割り当てに問題があります。私はそれをテストしました。 あなたのお手伝いがあります 悪い英語で申し訳ありません
スペースバーに問題がありますか?インデントは全面にあります –
上記で定義した 'BUFFER_LEN'という名前のマクロには値4096があります。これはサイズ4096のchar配列を定義するために使用されます。オーバーフローすることはできますか? –
コードの関連部分のみを表示してください。実際の問題がはるかに小さなコードブロック内にある場合、非常に多くのコードを読むのは難しいです。 – dasblinkenlight