나는 소켓 네트워킹 API 인 UNIX Network Programming 의 코드를 시도하고 있었는데 여기서 간단한 서버 클라이언트와 서버 기반 예제에 대한 코드를 발견했습니다.
서버 코드는
#define BL 10
void *get_in_addr(struct sockaddr *sa)
{
if (sa->sa_family == AF_INET)
{
return &(((struct sockaddr_in*) sa)->sin_addr);
}
return &(((struct sockaddr_in6*) sa)->sin6_addr);
}
int main(int argc, char ** argv)
{
struct sockaddr_in server, client;
int listenfd;
int port;
if (argc < 2)
{
printf("Port Not specified Error ~~ ! ");
exit(0);
}
port = atoi(argv[1]);
memset(&server, 0, sizeof(server));
server.sin_family = AF_INET;
server.sin_addr.s_addr = htons(INADDR_ANY);
server.sin_port = htons(port);
listenfd = socket(AF_INET, SOCK_STREAM, 0);
if (bind(listenfd, (struct sockaddr *) &server, sizeof(server)) == 0)
printf("\n [~] Bind Sucessfull \n");
if (listen(listenfd, BL) == 0)
printf("\n [~] Listenig on port %d \n\n ", port);
while (1)
{
socklen_t clientlen = sizeof(client);
printf("%d", clientlen);
int conffd = accept(listenfd, (struct sockaddr *) &client, &clientlen);
char s[INET6_ADDRSTRLEN];
inet_ntop(AF_INET, get_in_addr((struct sockaddr *) &client), s, sizeof(s));
if (conffd == -1)
printf("\n not Accepted \n");
else
{
printf("Got a connection from %s", s);
}
}
return 0;
}
클라이언트에 대한 코드는
int main(int argc, char ** argv)
{
struct sockaddr_in server;
int listenfd;
int port = 11111;
memset(&server, 0, sizeof(server));
inet_pton(AF_INET, argv[1], &server.sin_addr);
server.sin_family = AF_INET;
server.sin_port = htons(port);
listenfd = socket(AF_INET, SOCK_STREAM, 0);
if (connect(listenfd, (struct sockaddr *) &server, sizeof(server)) != 0)
{
printf("Connection error ! \n");
}
return 0;
}
여기서 문제는 서버를 시작하고 클라이언트를 실행할 때 서버에서 아무 일도 일어나지 않지만 "#IP에서 연결됨"이라고 표시됩니다.
출력은 다음과 같습니다.
./server 11111
[~] Bind Sucessfull
[~] Listenig on port 11111
출력되어야합니다.
./server 11111
[~] Bind Sucessfull
[~] Listenig on port 11111
Got an connection from 127.0.0.1
그래서 고객에게 문제가 있다고 생각했습니다.
그래서 확인하고 서버를 닫고 클라이언트를 다시 실행했는데 이제 연결 오류가 발생했습니다.
즉, 클라이언트가 제대로 작동하고 있으므로 문제는 서버의 accept ()
문제의 원인을 찾을 수없는 것 같습니다.
누군가가 무엇이 잘못되었는지 설명 할 수 있다면 정말 도움이 될 것입니다. :)
위의 주석에 대한 후속 조치로 표준 출력 stdout
이 라인 버퍼링 이라는 것을 알아야합니다. 즉, newline 만 만날 때만 버퍼의 내용을 출력 화면으로 보냅니다 \n
. 따라서 인쇄 문자열에 개행 문자가있을 때까지 [또는 수동으로 버퍼를 플러시하는 경우 fflush(stdout)
] 버퍼의 내용이 화면에 플러시되지 않습니다.
코드에서 성공 accept()
하면 printf()
이 호출되고와 함께 제공된 문자열이와 printf()
관련된 버퍼로 전송 stdout
되지만 내용은 화면으로 플러시 되지 않습니다 . 제어가 계속되고 다음 호출 에서 차단 된 상태가됩니다 accept()
. 따라서 출력 버퍼는 귀하의 경우 화면에 플러시 될 기회를 얻지 못합니다.
인쇄 문자열에 개행 문자 [\ n]를 추가하십시오. 버퍼의 내용이 즉시 플러시되고 화면에서 출력을 볼 수 있습니다.
printf("Got a connection from %s\n", s);
참고 : [출력 버퍼에 콘텐츠가 있는지 확인하기위한 것입니다.] 우리가 알고 있듯이 프로그램 종료로 인해 관련된 모든 버퍼가 플러시됩니다. 서버 실행을 수동으로 종료 할 수 있습니다. [아마도 crtl + c를 눌러서] 화면에서 인쇄 명세서를 볼 수 있습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다