c언어 TCP/IP 통신 질문

rktjd의 이미지

안녕하세요 처음으로 질문드리게되었습니다.
밑에 보이시는 코드는 TCP/IP 통신중 Server에 대한 코드입니다.

클라이언트쪽에서 11월달의 날짜를 입력하면 서버에서는 입력을 받아 요일을 나타내주는식인데
날짜 관련해서는 문제없이 진행되지만, 날짜 데이터가 아닌 다른 '123','abc'이런 엉뚱한 데이터를
입력하게되면 서버와 클라이언트 모두 멈춰버립니다.

/* ----WRITE---- */ '
WRITE 부분에서 예외처리를 해야하는지 또 어떻게 해결을 해야 할 지 답변 부탁드리겠습니다.

#include
#include
#include
#include
#include
#include

int calcSend(char *str1, char *str2)
{
//str1이 가리키는 문자가 종료 문자나 str1과 str2가 가리키는 문자가 다를 때까지 반복
for (; *str1 && (*str1 == *str2); str1++, str2++);
return *str1 - *str2;
}

int main()
{
char message[15];
int readByte = 0;
int serv_sock;
int clnt_sock;
struct sockaddr_in serv_addr;
struct sockaddr_in clint_addr;
socklen_t clnt_addr_size;
char monDate[5][6] = {"11/01","11/08","11/15","11/22","11/29"};
char tueDate[5][6] = {"11/02","11/09","11/16","11/23","11/30"};
char wedDate[4][6] = {"11/03","11/10","11/17","11/24"};
char turDate[4][6] = {"11/04","11/11","11/18","11/25"};
char friDate[4][6] = {"11/05","11/12","11/19","11/26"};
char satDate[4][6] = {"11/06","11/13","11/20","11/27"};
char sunDate[4][6] = {"11/07","11/14","11/21","11/28"};

/* ----SOCKET---- */
serv_sock = socket(AF_INET, SOCK_STREAM,IPPROTO_TCP); //1 //IPv4, TCP socket type, TCP protocol
if(serv_sock == -1)
printf("socket error\n");
serv_addr.sin_family = AF_INET; // IP protocol
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); //32bit IP4V address
serv_addr.sin_port = htons(3001); // 3000 port

/* ----BIND---- */
if(bind(serv_sock,(struct sockaddr*)&serv_addr, sizeof(serv_addr)) == -1) //2
printf("bind error\n");

/* ----LISTEN---- */
if(listen(serv_sock,0)==-1) //3 1 =backlog
printf("listen error\n");

/* ----ACCEPT---- */
clnt_addr_size = sizeof(clint_addr);
clnt_sock = accept(serv_sock,(struct sockaddr*)&clint_addr,&clnt_addr_size); //4
if(clnt_sock == -1)
printf("accept error\n");

/* ----READ---- */
while(1) {
char *mdate;
char *err = "Error: \n";
char *errmsg = err+message;
printf("Message Receives .... \n");
readByte = read(clnt_sock,message,sizeof(message));
//readByte = recv(clnt_sock, message, sizeof(message)-1, 0);
if(readByte == -1)break;
printf("Client --> : %s \n", message);
/* ----WRITE---- */
message[readByte] = '\0';
for(int i=0; i<5; i++ )
{
if(strcmp(message,monDate[i]) == 0) {
write(clnt_sock,"Monday",7);
}else if(strcmp(message,tueDate[i]) == 0) {
write(clnt_sock,"Tuesday",8);
}else
printf("123 : %s",errmsg);
}

for(int a=0; a<4; a++)
{
if(strcmp(message,wedDate[a]) == 0) {
write(clnt_sock,"Wednesday",10);
}else if(strcmp(message,turDate[a]) == 0) {
write(clnt_sock,"Tursday",8);
}else if(strcmp(message,friDate[a]) == 0) {
write(clnt_sock,"Friday",7);
}else if(strcmp(message,satDate[a]) == 0) {
write(clnt_sock,"Saturday",9);
}else if(strcmp(message,sunDate[a]) == 0) {
write(clnt_sock,"Sunday",7);
}//else
//printf("ERR DATA\n");
}

/* ----CLOSE---- */
if(strcmp(message,"exit") == 0) {
printf("Close Connection ... \n");
close(serv_sock);
break;
}
}
}

라스코니의 이미지

먼저 코드는 < code > ... < /code > 로 감싸서 보기 좋게 바꾸어 주세요.

char message[15];
char *err = "Error: \n";
char *errmsg = err+message;

이 부분에서 오류 소스일 것 같네요. 실제 시스템이 뻣는 것은 printf("123 : %s",errmsg); 부분이 될 것 같고요.

message는 스택(stack)에 영역이 생성되고 err는 메모리 상수 영역을 가르킵니다.
char *errmsg = err+message; 가 뭘 의도하는 것인지 모르겠는데 err 주소와 message 주소를 더하고 있는데 그 합이 어떤 의미도 없고 잘못된 주소를 가리키게 될 겁니다. 그 주소를 가지고 printf("123 : %s",errmsg)를 호출하여 엑세스하면 시스템이 뻣겠죠.

물론 디버그해보지 않고 그냥 코드만 보고 말씀드리는 겁니다. char *errmsg = err+message; 가 당초에 뭘 의도하신건지.. 이렇게 해도 동작할 지 확인해 보세요.

rktjd의 이미지

저 부분은 오류가 맞습니다.
제가 질문 드린 부분은 WRITE 부분입니다.
서버에서 클라이언트로 데이터를 보내는 부분에서 요일데이터 이외의 값을 보낼때 무한 루프에 빠지기때문에
그 for 안에 if 문에서 예외처리를 어떻게하는지 여쭈어보고싶습니다.

라스코니의 이미지

이런 부분에 예외처리는 적당하지 않습니다.
서버 코드에서 WRITE 부분에 디버그를 걸고 어디에서 걸리는지 확인해 보세요. 각 라인마다 step-by-step으로 실행시키다 보면 찾을 수 있는 문제입니다.
다만 무한 루프에 빠지는 것이 아니라 segmentation fault가 나야 할 것 같은데 이상하네요.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.