안녕하세요. 스레드를 사용하는 동안 printf에 약간의 문제가 있습니다. 문제는 터미널이 이전에 인쇄해야하는 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()'] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/flockfile.html)과'funlockfile()'에 대해서 생각할 필요가 있습니다. –
문제는 어디에서 발생합니까 - 대기/수신, 대기/수신, 대기 중입니다. 그것이 당신이 코딩 한 방법이며 기대했던 결과물입니다. 수락 스레드는 시작하고 대기 한 다음 두 개의 연결을 수신 한 다음 다른 연결을 기다립니다. –
@JonathanLeffler는'printf (연결 대기 중 \ n "); '의 위와 아래에서'fflush (stdout)'을 실제로 넣었지만 여전히 출력은 동일했습니다 – quartaela