TCP/IP 소켓프로그래밍 질문 드립니다.

kjinm88의 이미지

이제 막 리눅스 배우기 시작했는데 잘 안되네요

지금 geany에서 echo_client와 echo_server를 만들고 있는데

둘 다 컴파일은 되는데 실행시키면 0으로 반환되지 않고 에러가 났다고 뜨네요ㅜㅜ

소스와 에러는 다음과 같아요

먼저 echo_client,

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

#define MAXLINE 1024

int main(int argc, char **argv)
{
struct sockaddr_in serveraddr;
int server_sockfd;
int client_len;
char buf[MAXLINE];

if ((server_sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1 )
{
perror("error :");
return 1;
}

server_sockfd = socket (AF_INET, SOCK_STREAM, 0);
serveraddr.sin_family = AF_INET;
serveraddr.sin_addr.s_addr = inet_addr ("127.0.0.1");
serveraddr.sin_port = htons(3500);

client_len = sizeof(serveraddr);

if (connect (server_sockfd, (struct sockaddr *)&serveraddr, client_len) == -1 )
{
perror("connect error :");
return 1;
}

memset(buf, 0x00, MAXLINE);
read(0, buf, MAXLINE);
if (write (server_sockfd, buf, MAXLINE) <= 0)
{
perror("write error:");
return 1;
}

memset(buf, 0x00, MAXLINE);
if (read(server_sockfd, buf, MAXLINE) <= 0)
{
perror("read error :");
return 1;
}
close(server_sockfd);

printf("read : %s", buf);

return 0;
}

에러는
connect error :: connection refused
(program eixted with code : 1)

이렇게 뜨네요 제 생각에는 connect함수에서 뭔가 잘못된거 같은데 어딘지 도통 모르겠네요ㅜ

그리고 echo_server는

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

#define MAXBUF 1024

int main(int argc, char **argv)
{
int server_sockfd, client_sockfd;
int n;
int client_len;

char buf [MAXBUF];
struct sockaddr_in clientaddr, serveraddr;

client_len = sizeof(clientaddr);

if ((server_sockfd = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1)
{
perror("socket error : ");
exit (0);
}
bzero(&serveraddr, sizeof(serveraddr));
serveraddr.sin_family = AF_INET;
serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);
serveraddr.sin_port = htons(atoi(argv[1]));

bind (server_sockfd, (struct sockaddr *)&serveraddr, sizeof(serveraddr));

listen(server_sockfd, 5);

while(1)
{
memset(buf, 0x00, MAXBUF);
client_sockfd = accept(server_sockfd, (struct sockaddr *)&clientaddr, &client_len);

printf("New Client connect : %s\n", inet_ntoa (clientaddr.sin_addr));

if ((n = read(client_sockfd, buf, MAXBUF)) <= 0 )
{
close(client_sockfd);
continue;
}

if (write(client_sockfd, buf, MAXBUF) <= 0 )
{
perror("write error:");
close (client_sockfd);
}
close (client_sockfd);
return 0;
}
}

이고 이건 조금 더 사태가 심각해요ㅠ
컴파일하면
gcc -Wall -c "echo_server.c" (폴더: /home/kang/workspace/jinmyeong)
echo_server.c: In function ‘main’:
echo_server.c:40:49: warning: pointer targets in passing argument 3 of ‘accept’ differ in signedness [-Wpointer-sign]
In file included from echo_server.c:2:0:
/usr/include/x86_64-linux-gnu/sys/socket.h:214:12: note: expected ‘socklen_t * __restrict__’ but argument is of type ‘int *’
성공적으로 컴파일 완료함.

이런 메세지가 나오구요

혹시나 싶어서 int client_len; 를 socklen_t client_len로 바꾸니깐 컴파일은 되는데 실행하면
segmentation fault (core dumped)라고 뜨네요ㅜㅜ 울고싶습니다.

두 개 다 문제 없이 컴파일 되면
그제서야 터미널을 켜서 통신이 이루어지는 것을 확인할수 있을텐데 갈길이 너무 멀군요
형님들 도와주십쇼ㅜㅜ

익명 사용자의 이미지

실행할 때 뒤에 포트번호 입력하셨나요?

morolty의 이미지

일단 서버측에서 발생하는 그 문구는 -Wall 옵션때문에 나타나는 문구에요..

http://blog.daum.net/ossogood/8435412

구글링에서 나오는 블로그에 -W 옵션에 대한 설명이 있네요. 아주 사소한 Warning까지 다 표시해주는 옵션입니다.

그리고 클라이언트쪽 connect 함수에러는, 서버쪽 프로그램이 켜져 있는 상태여야 connect가 되겠죠?

클라이언트쪽에서, 접속하는 서버가 127.0.0.1 인거 보니 같은 컴퓨터에서 서버와 클라이언트를 같이 켜서 하시는 모양이네요..

혹여 리눅스 가상머신을 두개 켜서 해당 가상머신끼리 소켓 통신하는 경우라면, 방화벽 문제로 커넥트가 안될 수 있습니다. iptables 방화벽 해제 방법을 구글링해서 방화벽 해제한 후 다시 해 보세요.

댓글 달기

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