소켓 프로그래밍이 처음입니다. 수신자를위한 코드를 작성했습니다.
#include<stdio.h>
#include<stdlib.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<netinet/ip.h>
#include<string.h>
#include<unistd.h>
int main()
{int ret= socket(AF_INET,SOCK_DGRAM,0);
if (ret==-1)
{printf("\nsocket creation fails");
exit (0);}
else
printf("\nsocket creation succeeds");
struct sockaddr_in sender;
int port;
printf("\nEnter port:");
scanf("%d",&port);
sender.sin_family= AF_INET;
sender.sin_port=htons(port);
sender.sin_addr.s_addr=INADDR_ANY;
int ret1;
ret1= bind(ret,(struct sockaddr *)&sender,sizeof(sender));
if(ret1==-1)
{printf("\nsocket binding fails");
exit (0);}
else
printf("\nsocket binding succeeds");
struct sockaddr_in receiver;
char str[15];
int addrlen=sizeof(receiver);
while(1)
{int rec=recvfrom(ret,str,sizeof(str),0,(struct sockaddr*)&receiver,&addrlen);
printf("\nreceived");
str[rec]='\0';
if(strcmp(str,"exit")==0)
break;
if (rec==-1)
{printf("\nrecvfrom fails");
exit (0);}
else
{printf("\nrecv succeeds");
printf("\n%s",str);}
}
close(ret);
return 0;
}
이 코드의 출력 은 다음 줄에 인쇄되고 received
그 recv succeeds
후에 커서는 다음 줄로 이동하지만 str은 인쇄하지 않습니다. 그러나 다음 반복에서는 이전 str 값이 received
및 이전에 인쇄 recv succeeds
됩니다. 내가 사용하면이 문제는 해결되었다 printf("%s\n",str)
대신 printf("\n%s",str)
. 왜 이런 일이 발생합니까?
표준 출력 스트림 stdout
은 일반적으로 터미널로 전달 될 때 라인 버퍼링됩니다. C 2018 7.21.3 3 :
… 스트림이 라인 버퍼링 될 때 , 문자는 개행 문자가 발견 될 때 블록으로 호스트 환경으로 또는 호스트 환경에서 전송되도록 의도됩니다. 또한 문자는 버퍼가 채워 졌을 때, 버퍼링되지 않은 스트림에서 입력이 요청 될 때 또는 호스트 환경에서 문자를 전송해야하는 라인 버퍼 된 스트림에서 입력이 요청 될 때 호스트 환경에 블록으로 전송되도록되어 있습니다. …
따라서 개행 문자 뒤의 문자는 개행 문자가 기록되거나 scanf
연결된 입력 스트림에서 입력 을 요청할 때까지 (출력 장치에 표시되지 않는 컴퓨터 메모리 내부) 버퍼에 남아 있습니다. 명시 적으로 버퍼 비우기를 요청하거나 버퍼가 채워질 정도로 너무 많이 기록됩니다.
이런 이유로 printf
처음에 개행 문자를 사용하여 명령문 을 작성하는 것은 좋지 않습니다 "\nrecv succeeds"
. C는 .NET과 같은 일반적인 응용 프로그램의 줄 끝에 줄 바꿈 문자가있는 출력용으로 설계되었습니다 "recv succeeds\n"
.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다