과제
bread Caster
IP 와 dlfmadmf QNfuwndjfk
Reveiver
ip: 이름
1치면 다보냄 ??????????????암튼 그럼
소스를 써보자
얘는 보내는넘 news_sender_brd.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#define BUF_SIZE 30
void error_handling(char *message);
int main(int argc, char *argv[])
{
int send_sock;
struct sockaddr_in broad_adr;
FILE *fp;
char buf[BUF_SIZE];
int so_brd=1;
if(argc!=3) {
printf("Usage : %s 127.0.0.49 9190 \n", argv[0]);
exit(1);
}
send_sock=socket(PF_INET, SOCK_DGRAM, 0);
memset(&broad_adr, 0, sizeof(broad_adr));
broad_adr.sin_family=AF_INET;
broad_adr.sin_addr.s_addr=inet_addr(argv[1]);
broad_adr.sin_port=htons(atoi(argv[2]));
setsockopt(send_sock, SOL_SOCKET,
SO_BROADCAST, (void*)&so_brd, sizeof(so_brd));
if((fp=fopen("news.txt", "r"))==NULL)
error_handling("fopen() error");
while(!feof(fp))
{
fgets(buf, BUF_SIZE, fp);
sendto(send_sock, buf, strlen(buf),
0, (struct sockaddr*)&broad_adr, sizeof(broad_adr));
sleep(2);
}
close(send_sock);
return 0;
}
void error_handling(char *message)
{
fputs(message, stderr);
fputc('\n', stderr);
exit(1);
}
news_receiver._brd.c 애는 받는넘
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#define BUF_SIZE 30
void error_handling(char *message);
int main(int argc, char *argv[])
{
int recv_sock;
struct sockaddr_in adr, hows_adr;
socklen_t adr_sz;
int str_len;
char *str;
char str_arr[20];
char buf[BUF_SIZE];
if(argc!=2) {
printf("Usage : %s 9190 \n", argv[0]);
exit(1);
}
recv_sock=socket(PF_INET, SOCK_DGRAM, 0);
memset(&adr, 0, sizeof(adr));
adr.sin_family=AF_INET;
adr.sin_addr.s_addr=htonl(INADDR_ANY);
adr.sin_port=htons(atoi(argv[1]));
if(bind(recv_sock, (struct sockaddr*)&adr, sizeof(adr))==-1)
error_handling("bind() error");
while(1)
{
str_len=recvfrom(recv_sock, buf, BUF_SIZE-1, 0, (struct sockaddr*)&hows_adr, &adr_sz);
if(str_len<0)
break;
str = inet_ntoa(hows_adr.sin_addr);
strcpy(str_arr, str);
printf("%s \n", str);
buf[str_len]=0;
fputs(buf, stdout);
}
close(recv_sock);
return 0;
}
void error_handling(char *message)
{
fputs(message, stderr);
fputc('\n', stderr);
exit(1);
}
글구 이제 음...
다시 gcc 해줘야 함 잘 gcc 해줘서 다 실행파일 만들고
보내기전
보내기후
!!!
그이후 아무나 막 보넨다 IP 다찾아 주고 있긴하지만
암튼 핵심은
inet_ntoa 함수 임
문자열 정보 -> 네트워크 바이트 순서의 정수(3)
2018.10.13
-
-
inet_ntoa 함수는 이름에서 알 수 있듯이 네트워크 바이트 순서로 정렬된 정수형 IP주소 정보를
우리가 쉽게 인식할 수 있도록 문자열 형태로 변환해주는 함수이다.
-
위 함수는 인자로 전달된 정수형태의 IP정보를 참조하여 문자열 형태의 IP정보로 변환해서,
변환된 문자열의 주소 값을 반환한다.
그런데 이 함수를 호출하는데 있어서 주의해야 할 점이있다.
그것은 반환형이 char형 포인터라는 사실이다.
문자열의 주소 값이 반환된다는 것은 이미 문자열이 메모리 공간에 저장되어있다는 뜻이다.
그런데 이 함수는 프로그래머에게 메모리 공간의 할당을 요구하지 않는다.
대신에 함수 내부적으로 메모리 공간을 할당해서 변환된 문자열 정보를 저장한다.
따라서 이 함수호출 후에는 가급적 문자열 정보를 다른 메모리 공간에 복사해 두는 것이 좋다.
또 다시 inet_ntoa 함수가 호출되면 전에 저장된 문자열 정보가 지워질 수 있기 때문이다.
즉, inet_ntoa 함수가 재 호출되기 전까지만 반환된 문자열의 주소 값이 유효하니,
오랫동안 문자열 정보를 유지해야 한다면 별도의 메모리 공간에 복사해둬야 한다.
좀 더 쉽게 쓰자면, inet_ntoa 함수가 호출되면 프로그래머가 직접 메모리 공간을 할당하는 것이 아니라,
inet_ntoa 함수 자체에서 메모리 공간을 할당하므로, 다시 inet_ntoa 함수호출이 되면
inet_ntoa 함수가 만든 메모리에 있던 전 데이터는 지워진다.
그러므로 다시 inet_ntoa 함수호출이 되기 전에 한번 다른 메모리 공간에 데이터를 저장해두고
호출해야한다.
아래의 사용 예제를 봐보자.
-
-
14번째 줄 : 구조체 변수 addr1에 저장된 IP정보를 전달하면서 inet_ntoa 함수를 호출하고 있다.
따라서 IP주소 정보를 담은 문자열의 주소 값이 반환된다.
-
15번째 줄 : 14번째 줄의 함수호출로 반환된 주소 값을 참조해서 문자열을 복사한다.
-
18, 19번째 줄 : inet_ntoa 함수가 다시 한번 호출되었다.
이로써 14번째 줄에서 반환된 주소 값에는 다른 문자열 정보가 채워진다.
이를 19번째 줄에서 출력한다.
-
20번째 줄 : 15번째 줄에서 문자열을 복사해뒀기 때문에
14번째 줄의 함수호출을 통해서 얻은 문자열을 재 출력할 수 있다.
-
실행결과
이분 잘함 ㅇㅇ
'[ 충남인력개발원 ] (2019) > ┗TCP&IP' 카테고리의 다른 글
프로세스 쓰레드 (0) | 2019.11.27 |
---|---|
git hub 추가 하기 (0) | 2019.11.27 |
리눅스의 실행 방식 (0) | 2019.11.26 |
송수신 사진으로 보기 (0) | 2019.11.26 |
Linux(리눅스) fg, bg, kill, Ctrl+Z (0) | 2019.11.26 |