Archive for the ‘ Socket Programming ’ Category

sendto(), recvfrom()

#include<sys/types.h>

#include<sys/socket.h>

int sendto(int sock, const void *msg, int len, unsigned flags, const struct sockaddr *addr, int addrlen);

sock : 데이터를 전송할 때 사용할 소켓의 파일 디스크립터.

msg : 전송하고자 하는 데이터를 저장해 놓은 버퍼를 가리키는 포인터. 이 포인터가 가리키는 버퍼의 데이터가 전송될 것이다.

len : msg 포인터가 가리키는 위치에서부터 몇 바이트를 전송할 것인지 그 크기를 인자로 넘겨준다.

flags : 옵션을 설정하는데 필요한 인자인데 일반적으로 0을 넣어주면 된다. 크게 사용되 않는다.

addr : 전송하고자 하는 곳의 주소 정보로 초기화한 다음에 인자로 넘겨주게 된다.

addrlen : addr 포인터가 가리키고 있는 구조체 변수의 크기를 인자로 넘겨준다.

#include<sys/types.h>

#include<sys/socket.h>

int recvfrom(int sock, void *buf, int len, unsigned flags, struct sockaddr *addr, int *addrlen)

sock : 데이터를 수신할 때 사용할 소켓의 파일 디스크립터

buf : 수신할 데이터를 저장할 버퍼를 가리키는 포인터이다.

len: 수신할 수 잇는 최대 바이트 수이다. 일반적으로 buf가 가리키는 저장소의 크기를 넘지 않는다.

flags : 옵션을 설정하는데 필요한 인자.

addr : 주소 정보 구조체 변수의 포인터를 인자로 넘긴다. 함수 호출이 끝나면, 데이터를 전송한 호스트의 주소 정보로 채워진다.

addrlen : addr 포인터가 가리키는 주소 정보 구조체 변수의 크기를 인자로 전달한다.

인터넷 주소 초기화

1. struct sockaddr_in addr;

2. char *server_ip=”127.0.0.1″;

3. char *server_port=”15000″;

4. memset(&addr, 0, sizeof(addr_len));

5 .addr.sin_family = AF_INET;

6. addr.sin_addr.s_addr = inet_addr(server_ip);

7. addr.sin_port = htons(atoi(server_port));

 

1. 에서 인터넷 주소 정보를 나타내는 구조체 변수 생성

2. 와 3. 에서 IP 주소와 Port 를 선언

4. 에서 memset 함수를 호출해서 인자로 전달된 구조체 변수를 0으로 초기화해 주고 있다. 구조체 변수의 모든 멤버를 적절한 값으로 초기화해 주는 경우 모든 멤버를 00으로 초기화할 필요는 없으나, 불필요한 데이터를 쓰레기 값으로 남겨두는 것은 문제의 소지가 될 수 있고, 나중에 디버깅하는데 어려움을 줄 수도 있다.

5. 에서 ‘프로토콜 체계’ 설정

6. 에서 IP 주소를 설정해 주는데, 스트링을 네트워크 바이트 순서로 된 32비트 IP 값으로 변환해서 대입해 주고 있다. sockaddr_in의 멤버에는 네트워크 바이트 순서로 값을 대입해야 함을 잊지말자.

7. 에서 atoi 함수를 사용하여 스트링을 정수 값으로 바꿔주고, 다시 htons 함수를 통해 네트워크 바이트 순서로 변환해 주고 있다.