리눅스 소켓프로그램에서 파이프 깨짐현상이요

dbckdgns의 이미지

정말 간단한 프로그램이거든요, 리눅스상에서 소켓을 이용한 서버프로그램와 클라이언트 프로그램입니다.
다른거 없구요, 그냥 간단히 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;
}

익명 사용자의 이미지

에러문구로 서치하면 많이 나와요.....
유명한 네트워크책 한권 읽고 시작하는것도 좋은듯싶네요.

mirr187의 이미지

일단 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되었는지도 확인해보시기를 바랍니다..

jaehoon의 이미지

socket descriptor 가 이미 close 된 상태에서

socket 에 read 나 write 를 할 때, SIGPIPE 가 발생합니다.

이 상황에서는 SIGPIPE 가 발생하지 않을 것 같은데요. ^^

nomoreid의 이미지

제 블로그에 해결법을 적어두었습니다.

정상적인 네트웍 상황에서라도 broken pipe를 피할 방법은 없습니다.

네트웍 사정이 안좋아서 연결이 끊긴다거나 클라이언트 프로그램이 강종된 상태에서

서버가 클라이언트에 write 하려고 해도 생기는 시그널이니까요.

서버에서 시그널을 무시하게 해줘야 합니다.

http://nomoreid.egloos.com/1169779

서버에서 시그널을 무시하게 하면 적어도 서버는 죽지 않게 됩니다.

일단 이렇게 해보신 후

의도하지 않았는데 클라이언트와 서버와 연결이 끊기는 부분이 있다면 그부분에 대해서
고민을 해보셔야 할거 같네요.

Never Ending 삽질.

Never Ending 삽질.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.