저 질문이 있습니다. socket programming인데요..

글쓴이: 익명 사용자 / 작성시간: 목, 2001/11/01 - 12:54오후
이번에 학교 수업 중에 socket을 이용한 chatting 프로그램을 짜는 프로젝트
가 있습니다.
수업에서 제공하는 서버는 솔라리스 유닉스 인데, 이곳에서 컴파일은 아주 잘
되고 실행도 잘 됩니다.
문제는 이 프로그램을 그대로 제 컴으로 옮겨와서 컴파일 시키려고 했는데 문
제가 발생했습니다.(제 컴은 wow linux 7.1이구 gcc는 2.96입니다.)
mydaytime.c를 컴파일 시킬때..
gcc -o mydaytime mydaytime.c -lsocket -lnsl
로 하라고 써 있어서 그대로 했는데 라이브러리가 없어서
컴파일이 안됐습니다.
그래서 뒤의 라이브러리 설정을 빼고 컴파일 했는데 에러는
없더군요..
그리고 실행을 했는데 실행이 제대로 되지 않았습니다.
혹시나 해서 다른 프로그램을 컴파일 시켰는데 실행되지 않더군요..
뭐가 잘 못된 건가요?
꼭 답변 부탁 드립니다.
Forums:
확실히 알 수는 없지만...
그냥 쉽게 든 생각입니다.
솔라리스 워크스테이션이었다면, big endian byte order 일 겁니다.
x86 머쉰이면 little endian byte order 겠죠.
이게 원인일 수도 있을 겁니다.
아닐 가능성이 더 많겠죠. ㅡㅡ;
그냥 실행이 안된다고 말씀하시면 답변하기도 쉽지 않을 것 같네요...
Re: 저 질문이 있습니다. socket programming인데요..
안녕하세요
유닉스와 달리, 리눅스에서는
gcc -o mydaytime mydaytime.c -lsocket -lnsl
--------------
이부분을 안쓰셔도 컴파일됩니다. 컴파일할때 자동으로 옵션이
되는 것으로 알고있습니다.
그리고 왜 안되는지 소스를 올려주세요.
Re^2: 저 질문이 있습니다. socket programming인데요..
우선 답변에 감사 드립니다.
안돼는 이유는 잘 모르겠구요.. 솔라리스 유닉스에서는 이 프로그램을 실행시
키면 올바른 결과를 나타냅니다.
리눅스에서는 자꾸 연결할 수 없다고 하네요..
소스는 아래와 같습니다.
/*-----------------------------------------------------------------------
-------
------------------------------
파일명 mydaytime.c
기 능 daytime 서비스를 요구하는 TCP(연결형) 클라이언트
컴파일 gcc -o mydaytime mydaytime.c -lsocket -lnsl
실행예 mydaytime 163.152.46.118
-------------------------------------------------------------------------
-------
------------------------------ */
#include
#include
#include
#include
#define BUF_LEN 128
int main(int argc, char *argv[]) {
int s, n;
struct sockaddr_in server_addr;
char *haddr;
char buf[BUF_LEN+1];
if(argc != 2) {
printf("usage %s ip_address\n", argv[0]);
return -1;
}
haddr = argv[1];
/* 소켓 생성 */
if((s = socket(PF_INET, SOCK_STREAM, 0)) < 0) {
printf("can't create socket\n");
return -1;
}
/* 서버의 소켓주소 구조체 server_addr을 '\0'으로 초기화 */
bzero((char *)&server_addr, sizeof(server_addr));
/* server_addr의 주소 지정 */
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = inet_addr(haddr);
server_addr.sin_port = htonl(13);
/* 연결요청 */
if(connect(s, (struct sockaddr *)&server_addr, sizeof(server_addr))
< 0) {
printf("can't connect.\n");
return -1;
}
/* 서버가 보내오는 daytime 메세지의 수신 및 화면출력 */
while((n = read(s, buf, BUF_LEN)) > 0) {
buf[n] = '\0';
printf("%s", buf);
}
close(s);
}
----------------------------------------------------------------------
163.152.46.118은 수업에서 제공되는 server의 ip입니다.
이외에도 chatting 프로그램도 있는데 그것은 소스가 길어서요..
그럼.. 꼭 답변 부탁드립니다.
포트를 막아놔서 그렇습니다.
daytime의 포트가 막혀있을 겁니다.
열어주면 잘되겠죠.
daytime에도 버그가 있는지 필요하지 않다고 생각되는건 죄다 막아놨더군요.
xinetd을 사용하면 /etc/xinetd.d/daytime 의 disable = yes를
disable = no로 바꿔주면 됩니다.
물론 /etc/xinetd.daytime-udp도 바꿔주시면 UDP접속을 할 수 있죠.
Re^4: 포트를 막아놔서 그렇습니다.
감사 합니다.
echo program도 똑 같이 연결할 수 없다고 그러던데 그것도 포트가 막혀 있는
것인가요? 이런것에 대해서는 어떻게 해야 하는지요?
이런 정보는 어디에서 찾아야 하나요?
Re^5: 포트를 막아놔서 그렇습니다.
글쎄요... 찾아보니 echo도 서비스에 등록되어있군요. ^^;
대부분의 서비스는 /etc/services에 등록되어있습니다.
물론 이것은 제공할 수 있는 서비스와 포트 그리고 사용하는 통신 종류
(TCP/UDP)를
적어 놓은 곳입니다.
요즘은 xinetd을 많이 사용하고 예전에는 inetd을 사용하니 현재 사용하는
것을 man으로 보면 도움말이 나오겠죠.(저도 자세하게는 모르거든요. ^^;)
그리고 서비스를 열거나 닫는 방법은
/usr/share/doc/xinetd-2.3.0
의 문서중에(버젼은 틀릴 수가 있습니다.) sample.conf를 참고해서 만드시면
되겠네요.
댓글 달기