สวัสดี มีปัญหาเล็กน้อยกับ printf ขณะใช้งานเธรด ปัญหาคือเทอร์มินัลจะพิมพ์คำสั่ง printf หนึ่งคำสั่งในภายหลังซึ่งควรพิมพ์ก่อนหน้านี้ นี่คือส่วนที่ฉันกำลังเผชิญกับปัญหานี้
.
.
.
while(1){
printf("waiting for a connection\n");
csock = (int*)malloc(sizeof(int));
if((*csock = accept( hsock, (struct sockaddr*)&sadr, &addr_size))!= -1){
printf("---------------------\nReceived connection from %s\n",inet_ntoa(sadr.sin_addr));
client_counter++;
pthread_create(&thread_id,0,&SocketHandler, (void*)csock );
}
else{
fprintf(stderr, "Error accepting %d\n", errno);
}
}// end while
.
.
.
และนี่คือฟังก์ชันที่เธรดใช้
void* SocketHandler(void* lp){
int *csock = (int*)lp;
char buffer[1024];
int buffer_len = 1024;
int bytecount;
char* str_exit="exit";
while(1){
memset(buffer, 0, buffer_len);
if((bytecount = recv(*csock, buffer, buffer_len, 0))== -1){
fprintf(stderr, "Error receiving data %d\n", errno);
exit(0);
}
if(strcmp(buffer,str_exit)==0){
break;
}
printf("Received bytes %d\nReceived string \"%s\"\n", bytecount, buffer);
strcat(buffer, " SERVER ECHO");
if((bytecount = send(*csock, buffer, strlen(buffer), 0))== -1){
fprintf(stderr, "Error sending data %d\n", errno);
exit(0);
}
//printf("Sent bytes %d Sent String %s\n", bytecount,buffer);
}
printf("Client disconnected\n");
free(csock);
return 0;
}
และผลลัพธ์จะเป็นเช่นนี้ทุกครั้งที่ไคลเอนต์ (เธรด) เชื่อมต่อกับเซิร์ฟเวอร์
waiting for a connection
---------------------
Received connection from 127.0.0.1
waiting for a connection
Client disconnected
---------------------
Received connection from 127.0.0.1
waiting for a connection
Client disconnected
เมื่อไคลเอ็นต์แรกเชื่อมต่อเอาต์พุตจะทำงานได้อย่างถูกต้อง แต่เมื่อไคลเอ็นต์ที่สองเชื่อมต่อสตริง "waiting for a connection"
จะมาหลัง "Received connection"
มันควรจะทำงานในทางตรงกันข้าม ฉันจะดีใจถ้าคุณสามารถช่วยได้และขอบคุณต่อไป
fflush()
คุณอาจต้องคำนึงถึงflockfile()
และfunlockfile()
- person Jonathan Leffler   schedule 05.11.2012fflush(stdout)
ไว้ด้านบนและด้านล่างของprintf("waiting for a connection\n");
แต่ยังคงผลลัพธ์เหมือนเดิม - person quartaela   schedule 05.11.2012