그래서 나는 배우려고하는 Beej의 가이드를 다음 봤는데 몇 가지 기본적인 http://beej.us/guide/bgnet/C 소켓 프로그래밍의 Recv가 send와 함께 정지됩니까?
그래서 나는 간단하게 만들려고 노력 해요 그래서 어떤하여 연습을 위해 작성된 코드의 일부 놀러하기로 결정 networking- 입력 IP 주소가 사용자가 연결할 수있는 터미널 대화방입니다. 문제는 내가 편집 한이 "서버"파일에서 정보를 전송할 때 잘 작동하지만 recv 함수 호출은 터미널을 고정시킵니다. 웬일인지. 그리고 나는 이유를 정말로 모르고있다. accept가 제대로 작동하면 new_fd 소켓을 사용하여 클라이언트의 소켓을 나타내는 것처럼 보내고받을 수 있다고 가정합니다 ... 이것은 내가 갇혀있는 곳입니다.
더 많은 실제적인 네트워킹 경험을 얻기 위해 내가 배워야 할 다른 라이브러리가 무엇인지 궁금합니다. 내 발이 정말 낮은 수준의 물건으로 젖어있는 좋은 방법이라고 생각합니다. (꽤 깊기 때문에 좋아해요.) C 네트워킹 라이브러리가 다른 것들과 비교할 때 특히 효과적이라고 생각하지 않습니다. "동결"there-
int waiting = 1;
char input = ' ';
char message[100];
memset(&message, 0, sizeof message);
while(waiting) { // main accept() loop
sin_size = sizeof their_addr;
new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size);
if (new_fd == -1) {
perror("accept");
continue;
}
inet_ntop(their_addr.ss_family,
get_in_addr((struct sockaddr *)&their_addr),
s, sizeof s);//converts an IP address we get signal from to readable string
printf("%s wants to chat with you.\nAccept? Y/n\n", s);
scanf("%c", &input);
if (input == 'Y' || input == 'y') {
int rv;
/*if (connect(sockfd, p->ai_addr, p->ai_addrlen) == -1) {
close(sockfd);
perror("client: connect");
continue;
}*/
waiting = 0;
}
else {
printf("Waiting Mode\n");
}
}
char buf[100];
char prev[100];
char nil[100];
memset(nil, 0, sizeof nil);
int numbytes;
while (1) {
fgets(message, 100, stdin);
if (send(new_fd, message, 100, 0) == -1) {
perror("send");
}
if ((numbytes = recv(new_fd, buf, 100, 0)) == -1) {
perror("recv");
exit(1);
}
/*if (strcmp(prev, buf) == 0 || strcmp(nil, buf) == 0) {
continue;
}
buf[numbytes] = '\0';
printf("\n%s\n", buf);
memmove(prev, buf, sizeof buf);*/
}
return 0;
} 코멘트에 위에서 언급 한 바와 같이
기본적으로 'recv'는 수신 할 데이터가있을 때까지 차단됩니다. –
이 코드는 사용자가 채팅을 수락하지 않기로 선택하면 'new_fd'도 닫지 않습니다. 대기 루프가 종료되고 읽기가 시작될 때까지 유출 연결이있을 수 있습니다. –