리눅스 소켓프로그램에서 파이프 깨짐현상이요
정말 간단한 프로그램이거든요, 리눅스상에서 소켓을 이용한 서버프로그램와 클라이언트 프로그램입니다.
다른거 없구요, 그냥 간단히 read write 하나씩밖에 없습니다. 그것도 배열에있는거 보내서 받아서 표시하기 .!
근데 왜 클라이언트 쪽에서 파이프 깨짐 이라는 말이나오고 동시에 서버쪽에서는 프로그램이 멈춰버립니다.
한번은실행이 되는데 그 다음부터는 랜덤하게 깨짐현상이 발생하네요..ㅠㅠ
뭐가 뭔지 모르겠습니다.
고수님들 소스 한번만 봐주세요. 부탁드립니다.
==================서버=========
#include
#include
#include
#include
#include
#include
#include
#define PORT 55000
int main()
{
int server_socket;
int client_socket;
struct sockaddr_in server_address;
struct sockaddr_in client_address;
int client_address_size;
char toClient[]="Hello Clinet !!\n";
char fromClient[100];
server_socket=socket(AF_INET, SOCK_STREAM, 0); // 책에는 PF_INET 라고나와있던데
//제가고친건데맞죠?
printf("Server socket create!!!\n");
memset(&server_address, 0, sizeof(server_address));
server_address.sin_family=AF_INET;
server_address.sin_addr.s_addr=htonl(INADDR_ANY);
server_address.sin_port=htons(PORT);
bind(server_socket, (struct sockaddr*) &server_address, sizeof(server_address));
listen(server_socket, 5);
printf("Wait Client...\n");
client_address_size = sizeof(client_address);
client_socket = accept(server_socket, (struct sockaddr*) &client_address,
&client_address_size);
printf("Client Connect !!!\n");
read(client_socket, fromClient, sizeof(fromClient));
printf("From Client Message : %s \n", fromClient);
write(client_socket, toClient, sizeof(toClient));
printf("To Client Message: %s \n", toClient);
close(client_socket);
return 0;
}
=============클라이언트====
#include
#include
#include
#include
#include
#include
#include
#define PORT 55000
main()
{
int clientSocket;
struct sockaddr_in server_address;
char toServer[]= "Hello Server!!! I'm Client!\n";
char fromServer[100];
clientSocket = socket(AF_INET, SOCK_STREAM, 0); // 책에는 PF_INET 라고나와있던데
//제가고친건데맞죠?
printf("Create Client Socket !!\n");
memset(&server_address, 0, sizeof(server_address));
server_address.sin_family=AF_INET;
server_address.sin_addr.s_addr=inet_addr("127.0.0.1");
server_address.sin_port=htons(PORT);
connect(clientSocket, (struct sockaddr*) &server_address, sizeof
(server_address));
printf("Connect Server!!\n");
write(clientSocket, toServer, sizeof(toServer));
printf("To Server Message : %s \n", toServer);
read(clientSocket, fromServer, sizeof(fromServer));
printf("From Server Message : %s \n", fromServer);
close(clientSocket);
return 0;
}
참.. 그리고 제가 고친거라고 한거, 책에있는데로 해도 똑같은현상이 나타납니다
.
에러문구로 서치하면
에러문구로 서치하면 많이 나와요.....
유명한 네트워크책 한권 읽고 시작하는것도 좋은듯싶네요.
일단 PF_INET과 AF_INET을
일단 PF_INET과 AF_INET을 socket.h에서 찾아보신다면...
socket.h:#define AF_INET PF_INET
로 되어 있습니다.... 즉.. 상관없죠...ㅎㅎ;;
SIGPIPE 는 어느 부분에서 발생하신다는거죠??
server인가요? client인가요?
보통 fd값이 문제되는 경우가 있던데, 한번 확인해보시는게 좋겠네요... ^^;
ps. connect나 accept등 socket관련 lib를 호출하게 되는 경우 if조건으로 정상적으로 connect 또는 accept되었는지도 확인해보시기를 바랍니다..
SIGPIPE 가 나는 이유를
socket descriptor 가 이미 close 된 상태에서
socket 에 read 나 write 를 할 때, SIGPIPE 가 발생합니다.
이 상황에서는 SIGPIPE 가 발생하지 않을 것 같은데요. ^^
많이 올라온 문제네요 ^^;
제 블로그에 해결법을 적어두었습니다.
정상적인 네트웍 상황에서라도 broken pipe를 피할 방법은 없습니다.
네트웍 사정이 안좋아서 연결이 끊긴다거나 클라이언트 프로그램이 강종된 상태에서
서버가 클라이언트에 write 하려고 해도 생기는 시그널이니까요.
서버에서 시그널을 무시하게 해줘야 합니다.
http://nomoreid.egloos.com/1169779
서버에서 시그널을 무시하게 하면 적어도 서버는 죽지 않게 됩니다.
일단 이렇게 해보신 후
의도하지 않았는데 클라이언트와 서버와 연결이 끊기는 부분이 있다면 그부분에 대해서
고민을 해보셔야 할거 같네요.
Never Ending 삽질.
Never Ending 삽질.
댓글 달기