코드좀 살펴봐주심 감사하겠읍니다

jjjjrr의 이미지

안녕하세요
리눅스처음공부하는 초짜입니다
다른고수님의 소스를 나름대로 조금 고쳤는데
에러가 무지많이나는군요
한번살펴봐주시면감사하겠읍니다

#include <sys/stat.h>

#include <time.h>
#include <sys/socket.h>
#include <signal.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/un.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>

// ------------------------------
// 전역 자료들
// ------------------------------
typedef struct clientdata
{
unsigned long int addr;
int port;
int start_time;
} clndata;

// 쓰레드 전역 함수들
void *thread_comm(void *);

int main(int argc, char **argv)
{
pthread_t p_thread;
struct sockaddr_in clientaddr, serveraddr;
char th_data[256];

int server_sockfd, client_sockfd, client_len;

memset(th_data, 0x00, 256);

if ((server_sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
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]));

if (bind(server_sockfd, (struct sockaddr *)&serveraddr,
sizeof(serveraddr)) == -1)
{
perror("bind error : ");
exit(0);
}
if (listen(server_sockfd, 5) == -1)
{
perror("bind error : ");
exit(0);
}

// Client 의 연결을 받아들인다.
// 새로운 Client 가 들어오면 쓰레드를 생성시킨다.
// 이때 쓰레드 함수아규먼트로 Client 소켓지시자와 struct sockaddr_in
// 정보를 넘긴다.
while(1)
{
client_len = sizeof(clientaddr);
client_sockfd = accept(server_sockfd, (struct sockaddr *)&clientaddr,
(socklen_t *)&client_len);

// 쓰레드로 넘길 정보를 만든다.
// 0 .... 255
// th_data 의 구조
// +------+------------------+-----+
// |sockfd|struct sockaddr_in| |
// +------+------------------+-----+
memcpy(th_data, (void *)&client_sockfd, sizeof(client_sockfd));
memcpy(th_data+sizeof(client_sockfd), (void *)&clientaddr, client_len);

// 쓰레드 생성
if (pthread_create(&p_thread, NULL, thread_comm, (void *)th_data) == -1)
{
perror("thread Create error\n");
exit(0);
}

else
{
// cout << "Thread Create Success" << endl;
}
}
}

void *thread_comm(void *data)
{
int sockfd;
clndata clientinfo;

struct hostent *myent;
struct in_addr *myen;
long int *add;

struct sockaddr_in clientaddr;
int client_len = sizeof(clientaddr);
char buf[255];
char query[255];


pthread_t th;

// pthread_join 을 하지 않을것임으로
// detach 를 해줘서 쓰레드 종료시
// 쓰레드 자원을 정리할수 있도록 해줘야 한다.
pthread_detach(pthread_self());

memcpy((void *)&sockfd, (char *)data, sizeof(int));
memcpy((void *)&clientaddr, (char *)data+sizeof(int), client_len);

// 클라이언트 정보를 전역 자료에 입력한다.
// 입력되는 값은 주소(32bit), 포트, 연결시간이다.
clientinfo.addr = clientaddr.sin_addr.s_addr;
clientinfo.port = ntohs(clientaddr.sin_port);
time((time_t *)&clientinfo.start_time);



while(1)
{

if (read(sockfd, buf, 255) <= 0)
{
close(sockfd);
pthread_exit((void *)NULL);
}
if (strncmp(buf, "quit", 4) == 0)
{
write(sockfd, "bye bye", 8);
close(sockfd);
pthread_exit((void *)NULL);
}

// 그렇지 않을경우
sprintf(query, "./bindquery %s %s", buf,clientinfo.addr);

FILE *fp;
int state;

fp = popen(query, "r");
if (fp == NULL)
{
perror("erro : ");
exit(0);
}
state = pclose(fp);
myent = gethostbyname(buf);

while(*myent->h_addr_list != NULL)
{
add = (long int *)*myent->h_addr_list;
myen->s_addr = *add;
// printf("%s\n", inet_ntoa(*myen));
if(strcmp(clientinfo.addr,inet_ntoa(*myen) == 0)
{
write(sockfd, "query_ok", 255);
break;
}
myent->h_addr_list++;
}


close(sockfd);

write(sockfd, "end", 255);
memset(buf, 0x00, 255);
}
}


아래는 에러코드입니다
[root@ns1 root]# g++ -o aaa bindupdate.c -lpthread
bindupdate.c: In function `void* thread_comm(void*)':
bindupdate.c:159: `gethostbyname' undeclared (first use this function)
bindupdate.c:159: (Each undeclared identifier is reported only once for each 
   function it appears in.)
bindupdate.c:161: invalid use of undefined type `struct hostent'
bindupdate.c:102: forward declaration of `struct hostent'
bindupdate.c:163: invalid use of undefined type `struct hostent'
bindupdate.c:102: forward declaration of `struct hostent'
bindupdate.c:166: invalid conversion from `long unsigned int' to `const char*'
bindupdate.c:166: cannot convert `bool' to `const char*' for argument `2' to `
   int strcmp(const char*, const char*)'
bindupdate.c:167: parse error before `{' token
bindupdate.c:171: invalid use of undefined type `struct hostent'
bindupdate.c:102: forward declaration of `struct hostent'
bindupdate.c: At global scope:
bindupdate.c:180: parse error before `}' token
bindupdate.c:180:2: warning: no newline at end of file
[root@ns1 root]# 
dg의 이미지

딴지인데..
소스를 코드에다가 집어 너으면 보기 편해요..
들어쓰기 한거 같은데 다 첫 열에 붙어서 나오네요..
중간에 이모티콘 적용된 부분도 있고.. ㅡㅡ;
아래처럼요..

int main() {
	return 0;
}
jjjjrr의 이미지

죄송합니다
코드에 집어넣는다고한것인데
이렇게되었읍니다
리눅스에서 모질라를 사용하는데
사용방법을 잘몰라서여
복사하는것도 잘안되내여
제가원하는데로 잘안됩니다
붙여넣으면 엉뚱한곳에 다른글자가 와있구
몇번시도끝에 이정도라도 한것입니다
그리구
return 0;
는 넣어줘야되는건가요
행복한꿈꾸세요

wooix의 이미지

답글 달기 좀.. 그렇군요..

수정할곳을 알려 드리겠습니다.

1) write(sockfd,"bye bye", ;
--> write(sockfd,"bye bye",255);
좀 잘보셔야 겠군요.. 간혹 이런실수를 보면 남이 부탁한걸 어쩔수 없이 할때 자주 일어나는 현상이지요 ㅡㅡa

2) if( strcmp(clientinfo.addr,inet_ntoa(*myen) == 0 )
--> 괄호가 하나없군요 .. ")"추가해 주셈..

일단 눈에 보이는 에러는 여기까지고요.. 컴팔하고 나니 에러가 또 있더군요..

gethostbyname(const char *)
이거는 #include <netdb.h>해주십시요.. 빠졌군요..

마지막으로 아까 위에서 나왔던 strcmp부분인데..

clientinfo.addr이 unsigned long int인데.. char랑 비교하셨더군요..
알아서 수정하셈..

눈크게 뜨고 하면 다 잡을 수 있는 에러입니다. 고마 자야지..

평온하다~

cdpark의 이미지

C 프로그램을 C++ 컴파일러로 컴파일하는 이유라도 알 수 있을까요?

jjjjrr의 이미지

답변감사합니다
이쁜꿈꾸세여

xfmulder의 이미지

cdpark wrote:

"Any sufficiently advanced bug is indistinguishable from a feature."

이건 무슨뜻인가요?

내 자식들도 나처럼 !!

jjjjrr의 이미지

안녕하세요
에러해결은되었는데여
실행시켜서 접속해보면
클라이언트로부터 한번접속을 받으면 프로그램이 종료되어버립니다
쓰레드만종료되구 본프로그램에서는 계속 클라이언트의 접속을 받아야되는데
왜 종료되는지모르겠읍니다
그리구
서버는 리눅스에서
클라이언트는 윈도우저에서 사용하는데여
접속은되는데
데이타가 정확하게 전달되는것같지는 않읍니다
리눅스와 윈도우즈간에 통신을 하려면
다른방법이 필요한가요
텍스트를 보낼때 따로 처리해줘야될부분이 있나요
조언부탁드립니다

댓글 달기

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