코드좀 살펴봐주심 감사하겠읍니다
안녕하세요
리눅스처음공부하는 초짜입니다
다른고수님의 소스를 나름대로 조금 고쳤는데
에러가 무지많이나는군요
한번살펴봐주시면감사하겠읍니다
#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]#
딴지인데..소스를 코드에다가 집어 너으면 보기 편해요..들어쓰기
딴지인데..
소스를 코드에다가 집어 너으면 보기 편해요..
들어쓰기 한거 같은데 다 첫 열에 붙어서 나오네요..
중간에 이모티콘 적용된 부분도 있고.. ㅡㅡ;
아래처럼요..
죄송합니다코드에 집어넣는다고한것인데이렇게되었읍니다리눅스에서 모
죄송합니다
코드에 집어넣는다고한것인데
이렇게되었읍니다
리눅스에서 모질라를 사용하는데
사용방법을 잘몰라서여
복사하는것도 잘안되내여
제가원하는데로 잘안됩니다
붙여넣으면 엉뚱한곳에 다른글자가 와있구
몇번시도끝에 이정도라도 한것입니다
그리구
return 0;
는 넣어줘야되는건가요
행복한꿈꾸세요
답글 달기 좀.. 그렇군요..수정할곳을 알려 드리겠습니다.
답글 달기 좀.. 그렇군요..
수정할곳을 알려 드리겠습니다.
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랑 비교하셨더군요..
알아서 수정하셈..
눈크게 뜨고 하면 다 잡을 수 있는 에러입니다. 고마 자야지..
평온하다~
C 프로그램을 C++ 컴파일러로 컴파일하는 이유라도 알 수 있을까요?
C 프로그램을 C++ 컴파일러로 컴파일하는 이유라도 알 수 있을까요?
이쁜꿈꾸세여
답변감사합니다
이쁜꿈꾸세여
[quote="cdpark"]"Any sufficiently adva
이건 무슨뜻인가요?
내 자식들도 나처럼 !!
클라이언트로부터 한번접속을 받으면 프로그램이 종료되어버립니
안녕하세요
에러해결은되었는데여
실행시켜서 접속해보면
클라이언트로부터 한번접속을 받으면 프로그램이 종료되어버립니다
쓰레드만종료되구 본프로그램에서는 계속 클라이언트의 접속을 받아야되는데
왜 종료되는지모르겠읍니다
그리구
서버는 리눅스에서
클라이언트는 윈도우저에서 사용하는데여
접속은되는데
데이타가 정확하게 전달되는것같지는 않읍니다
리눅스와 윈도우즈간에 통신을 하려면
다른방법이 필요한가요
텍스트를 보낼때 따로 처리해줘야될부분이 있나요
조언부탁드립니다
댓글 달기