반응형
recvfrom(2)
#include <sys/types.h>
#include <sys/socket.h>
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
struct sockaddr *src_addr, socklen_t *addrlen);
datagram socket으로부터 데이터를 수신합니다. UDP 통신 등과 같은 Connectionless형 Datagram 통신에서 데이터를 수신합니다. struct sockaddr 구조체는 실제 Address Family의 종류에 따라서 다른 구조를 가집니다. (참조: struct sockaddr - Address Family에 따른 구조체 )
파라미터
sockfd
- 정상적으로 생성된 socket descriptor
buf
- 수신한 데이터를 저장할 buffer
len
- 읽을 데이터 크기
flags
- 읽을 데이터 유형 또는 읽는 방법에 대한 option
MSG_OOB : out of band(긴급데이터) 데이터를 읽습니다. 주로 X.25에서 접속이 끊겼을 때에 전송되는 데이터
MSG_PEEK : receive queue의 데이터를 queue에서 제거하지 않고 확인하기 위한 목적으로 설정함
MSG_WAITALL : 읽으려는 데이터가 buffer에 찰 때까지 대기함
src_addr
- 접속한 상대 시스템의 socket 주소 정보를 저장할 buffer로 Address Family에 따라 종류가 다릅니다.
- Datagram의 통신이라 상대 시스템과 항상 연결된 것이 아니기 때문에
데이터를 송신 시스템의 정보를 수신하는 이 시점에 알 수 있으며,
이 src_addr에 저장된 상대방 정보로 결과 데이터를 sendto(2)를 통하여 전송합니다.
addrlen
- src_addr의 크기를 설정한 후에 호출합니다. (INPUT)
- 호출 후에는 실제 할당된 src_addr의 크기가 저장됩니다. (OUTPUT)
RETURN
0 이상
- 정상적으로 데이터를 수신하였으며, 실제로 수신한 데이터의 길이를 return합니다.
-1
- 오류가 발생하였으며, 상세한 오류 내용은 errno에 저장됩니다.
EAGAIN or EWOULDBLOCK : time out이 발생하였거나 socket에 non-blocking이 설정된 경우
EBADF : sockfd가 유효하지 않는 descriptor
ECONNREFUSED : network상에서 접속 거부된 경우
EFAULT : 읽을 데이터를 저장할 buf가 유효하지 않은 메모리인 경우
EINTR : signal이 발생하여 interrupted 된 경우
EINVAL : 파라미터의 값이 유효하지 않은 경우
ENOMEM : 데이터 수신을 위한 메모리 할당이 되지 않은 경우 (recvmsg(2)호출시)
ENOTCONN : connect(2), accept(2)가 호출되지 않은 상태인 경우
ENOTSOCK : sockfd가 socket descriptor가 아닌 일반 파일인 경우
활용 예제
Sample
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
......
struct sockaddr_in addr;
int addr_len;
char buffer[2048];
int recv_len;
......
addr_len = sizeof(struct sockaddr_in);
while( (recv_len = recvfrom(sockfd, buffer, 256, 0, &addr, &addr_len)) == -1) {
if(errno == EINTR) { // signal이 발생하여 읽지 못한 경우
continue;
} else {
fprintf(stderr, "Recv Error: %s\n", strerror(errno));
return -1;
}
}
......
see also : Socket 통신과 Socket 응용
반응형
'C언어 header > sys | socket.h' 카테고리의 다른 글
sendto(2) - datagram 데이터를 전송하는 함수 (0) | 2019.09.29 |
---|---|
send(2) - 연결된 socket으로 데이터를 전송하는 함수 (0) | 2019.09.29 |
recv(2) - 데이터를 수신하는 함수 (0) | 2019.09.29 |
setsockopt(2) - socket의 속성을 설정하는 함수 (0) | 2019.09.29 |
getsockopt(2) - socket에 설정된 속성값을 얻는 함수 (0) | 2019.09.29 |