TCP recv send include systypes h include syssocket

  • Slides: 27
Download presentation

소켓 입출력 함수 : TCP • 소켓 읽기 함수 : recv • 소켓 쓰기

소켓 입출력 함수 : TCP • 소켓 읽기 함수 : recv • 소켓 쓰기 함수 : send #include <sys/types. h> #include <sys/socket. h> ssize_t recv(int sockfd, void *buf, size_t len, int flags); ssize_t send(int sockfd, const void *buf, size_t len, int flags); 뇌를 자극하는 TCP/IP 소켓 프로그래밍_ 윤 윤상배 상배 2/56

소켓 입출력 함수 : UDP • UDP는 연결지향이 아니므로 recv/send 함수를 사용할 수 없다.

소켓 입출력 함수 : UDP • UDP는 연결지향이 아니므로 recv/send 함수를 사용할 수 없다. • 데이터를 주고 받을 때, 주소를 확인해야 하기 때문. • 데이터를 읽은 곳의 주소와 받을 곳의 주소를 명시할 수 있는 함수 필요 • recvfrom • sendto ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen); ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen); 뇌를 자극하는 TCP/IP 소켓 프로그래밍_ 윤 윤상배 상배 2/56

소켓 입출력 함수 : UDP • Recvfrom과 sendto 함수의 TCP 사용 ü TCP 소켓에서는

소켓 입출력 함수 : UDP • Recvfrom과 sendto 함수의 TCP 사용 ü TCP 소켓에서는 데이터를 송수신할 경로를 이미 알고 있음 ü src_addr, dest_addr을 NULL로 설정 ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen); ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen); 뇌를 자극하는 TCP/IP 소켓 프로그래밍_ 윤 윤상배 상배 2/56

소켓 입출력 함수 : Out-of-Band • signal 혹은 select로 처리 가능 send(sockfd, "A", 1,

소켓 입출력 함수 : Out-of-Band • signal 혹은 select로 처리 가능 send(sockfd, "A", 1, MSG_OOB); ……………. void urg_handler(int signo) { recv(client_sockfd, (void *)&buf, 1, MSG_OOB); printf("OOB DATA %cn"); } signal(SIGURG, urg_handler); 뇌를 자극하는 TCP/IP 소켓 프로그래밍_ 윤 윤상배 상배 2/56

소켓 입출력 함수 : Out-of-Band • signal handler를 이용한 시그널 제어 void print_sigint(int signo)

소켓 입출력 함수 : Out-of-Band • signal handler를 이용한 시그널 제어 void print_sigint(int signo) { printf("SIG NUM is %dn", signo); } int main() { int i = 0; signal(SIGINT, print_sigint); while(1) { printf("%dn", ++i); sleep(1); } } 뇌를 자극하는 TCP/IP 소켓 프로그래밍_ 윤 윤상배 상배 2/56

소켓 입출력 함수 : echo_server_oob #define MAXLINE 1024 int client_sockfd; void urg_handler(int signo) {

소켓 입출력 함수 : echo_server_oob #define MAXLINE 1024 int client_sockfd; void urg_handler(int signo) { char buf; recv(client_sockfd, (void *)&buf, 1, MSG_OOB); printf("OOB DATA %cn", buf); } int main(int argc, char **argv) { int listenfd; int readn; socklen_t client_len; char buf[MAXLINE]; struct sockaddr_in clientaddr, serveraddr; if(argc != 2) { printf("Usage : %s [port num]n", argv[0]); return 1; } client_len = sizeof(clientaddr); 뇌를 자극하는 TCP/IP 소켓 프로그래밍_ 윤 윤상배 상배 2/56

소켓 입출력 함수 : echo_server_oob if ((listenfd = socket (AF_INET, SOCK_STREAM, 0)) < 0)

소켓 입출력 함수 : echo_server_oob if ((listenfd = socket (AF_INET, SOCK_STREAM, 0)) < 0) { perror("socket error : "); return 1; } bzero(&serveraddr, sizeof(serveraddr)); serveraddr. sin_family = AF_INET; serveraddr. sin_addr. s_addr = htonl(INADDR_ANY); serveraddr. sin_port = htons(atoi(argv[1])); bind (listenfd, (struct sockaddr *)&serveraddr, sizeof(serveraddr)); listen(listenfd, 5); while(1) { memset(buf, 0 x 00, MAXLINE); client_sockfd = accept(listenfd, (struct sockaddr *)&clientaddr, &client_len); if(client_sockfd == -1 ) { continue; } 뇌를 자극하는 TCP/IP 소켓 프로그래밍_ 윤 윤상배 상배 2/56

소켓 입출력 함수 : echo_server_oob signal(SIGURG, urg_handler); fcntl(client_sockfd, F_SETOWN, getpid()); while(1) { if ((readn

소켓 입출력 함수 : echo_server_oob signal(SIGURG, urg_handler); fcntl(client_sockfd, F_SETOWN, getpid()); while(1) { if ((readn = read(client_sockfd, buf, MAXLINE)) <= 0) { close(client_sockfd); continue; } if (write(client_sockfd, buf, strlen(buf)) <=0) { perror("write error : "); close(client_sockfd); } } 뇌를 자극하는 TCP/IP 소켓 프로그래밍_ 윤 윤상배 상배 2/56

윈도우 고급 입출력 함수 • send/sendto 함수 int send(__in SOCKET s, __in const char

윈도우 고급 입출력 함수 • send/sendto 함수 int send(__in SOCKET s, __in const char *buf, __in int len, __in int flags) int sendto(__in SOCKET s, __in const char *buf, __in int len, __in int flags __in struct sockaddr *from, __in int tolen) • flags : MSG_DONTROUTE와 MSG_OOB를 사용 • MSG_OOB는 TCP 소켓에서만 사용 가능 뇌를 자극하는 TCP/IP 소켓 프로그래밍_ 윤 윤상배 상배 2/56