과제

 

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 함수호출이 되기 전에 한번 다른 메모리 공간에 데이터를 저장해두고

 

호출해야한다.

 

아래의 사용 예제를 봐보자.

 

-

 

 inet_ntoa.c

 intoa

 

 

-

 

14번째 줄 : 구조체 변수 addr1에 저장된 IP정보를 전달하면서 inet_ntoa 함수를 호출하고 있다.

 

따라서 IP주소 정보를 담은 문자열의 주소 값이 반환된다.

 

-

 

15번째 줄 : 14번째 줄의 함수호출로 반환된 주소 값을 참조해서 문자열을 복사한다.

 

-

 

18, 19번째 줄 : inet_ntoa 함수가 다시 한번 호출되었다.

 

이로써 14번째 줄에서 반환된 주소 값에는 다른 문자열 정보가 채워진다.

 

이를 19번째 줄에서 출력한다.

 

-

 

20번째 줄 : 15번째 줄에서 문자열을 복사해뒀기 때문에

 

14번째 줄의 함수호출을 통해서 얻은 문자열을 재 출력할 수 있다.

 

-

 

실행결과

 

https://ss0x00.tistory.com/64

 

(리눅스) 문자열 정보를 네트워크 바이트 순서의 정수로(3)

문자열 정보 -> 네트워크 바이트 순서의 정수(3) 2018.10.13 - - inet_ntoa 함수는 이름에서 알 수 있듯이 네트워크 바이트 순서로 정렬된 정수형 IP주소 정보를 우리가 쉽게 인식할 수 있도록 문자열 형태로 변..

ss0x00.tistory.com

 

 

이분 잘함 ㅇㅇ

'[ 충남인력개발원 ] (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
블로그 이미지

Or71nH

,