시그널(SIGTERM), kill 명령 | ||||||||
☞ kill : 프로세스에 신호(종료신호)를 명시적으로 보낼때 사용하는 명령어
=> kill 프로세스ID
ps (process list) ☞ ps : 현재 창에서 돌고있는 프로세스(프로그램)을 보여줌 ☞ ps -A : 현재 돌고있는 모든 프로세스(프로그램)을 보여줌 ☞ ps -A | grep 프로그램명 : 현재 돌고있는 해당 프로세스(프로그램)의 정보(프로세스ID)를 보여줌
| ||||||||
pcap.c (추가된 내용만...) | ||||||||
#include <signal.h>
int main() { struct sigaction stAct; //sigaction을 하기 위한 구조체 변수 stAct.sa_handler = Smart; // 핸들러 등록 sigaction(SIGTERM, &stAct, 0); // kill 프로세스ID 명령 쳤을때 디폴트 동작이 아닌 핸들러 함수가 수행되도록함.
return 0; }
void Smart(int ia)// SIGINT 핸들러, SIGTERM 핸들러
| ||||||||
|
넌블로킹 입출력 | ||||||||||||||
원하지 않는 블로킹 문제를 해결하는 방법으로 소켓의 동작을 변경시켜 모든 호출이 넌블로킹이 되게 하는 것이 있다.
디폴트 블로킹 동작을 fcntl() ,file control 함수를 호출하여 변경할수 있음!!!
| ||||||||||||||
비동기적 입출력(Asynchronous I/O) | ||||||||||||||
☞ 비동기적 입출력 : 운영체제가 소켓호출이 성공적이었을때 프로그램에 알려줌으로써 프로그램은 소켓이 무슨일인가를 발생시킬 준비가 되었음을 알려 올때까지 다른 일을 하면서 시간을 보낼수 있음. (임의의 입출력 관련 이벤트가 소켓에 발생하였을때 SIGIO 시그널를 프로세스에 전달하는 방식으로 동작)
| ||||||||||||||
| ||||||||||||||
UDPserver.c |
#include <stdio.h> #define ECHOMAX 255
int iSock;
int main()
struct sigaction stAct; //sigaction을 하기 위한 구조체 변수
printf("Socket() failed\n"); return 0; }
memset(&echoServAddr, 0, sizeof(echoServAddr));// 구조체 0으로 초기화 echoServAddr.sin_family = AF_INET; //어드레스 패밀리
iRet = bind(iSock, (struct sockaddr *) &echoServAddr, sizeof(echoServAddr));
if(0 > iRet) printf("bind() failed\n"); close(iSock); return 0; }
cliAddrLen = sizeof(echoClntAddr);//구조체 크기
recvMsgSize = recvfrom(iSock, echoBuffer, ECHOMAX, 0, // 1번째 인자 : 소켓번호, 2번째 인자 : 버퍼주소
echoBuffer[recvMsgSize] = 0; //문자열로 만들기 위해 Null 넣어줌 printf("%s : ", inet_ntoa(echoClntAddr.sin_addr));// 클라이언트의 주소 출력 printf("%s\n", echoBuffer); // 전송받은 데이터 출력
}
return 0;
void SIGINT_handler(int ia) // SIGINT 핸들러
|
UDPclient.c |
#include <stdio.h> #define ECHOMAX 255
int iSock;
int main(int argc, char * argv[])
struct sigaction stAct; // sigaction을 하기 위한 구조체 변수
printf("Socket() failed\n"); return 0; }
memset(&echoServAddr, 0, sizeof(echoServAddr));// 구조체 0으로 초기화 echoServAddr.sin_family = AF_INET;
while(1) printf("메시지를 입력하세요\n"); // 1번째 인자 : 소켓번호, 2번째 인자 : 버퍼주소
void SIGINT_handler(int ia) // SIGINT 핸들러 |
UDP [ user datagram protocol ] : 정보를 주고받을 때, 서로 주고받는 형식이 아닌 한쪽에서 일방적으로 보내는 방식의 통신 프로토콜이다.
UDP는 사용자 데이터그램 프로토콜(user datagram protocol)의 줄임말이다. 인터넷상에서 서로 정보를 주고받을 때 정보를 보낸다는 신호나 받는다는 신호 절차를 거치지 않고, 보내는 쪽에서 일방적으로 데이터를 전달하는 통신 프로토콜이다. 보내는 쪽에서는 받는 쪽이 데이터를 받았는지 받지 않았는지 확인할 수 없고, 또 확인할 필요도 없도록 만들어진 프로토콜을 말한다. 인터넷 아이콘을 누르는 것과 동시에 자동적으로 중앙컴퓨터 서버와 연결되어 정보를 보내는 쪽과 받는 쪽이 서로 의사소통을 할 수 있도록 설계된 통신 프로토콜인 TCP(transmission control protocol)와 상대되는 개념이다. 예를 들어 이메일을 주고받을 때 '수신 확인'을 통해 상대방이 메일을 읽었는지 읽지 않았는지를 알 수 있는 것은 송수신측이 서로 데이터를 주고받을 수 있기 때문이다. 이처럼 송수신측이 서로 데이터를 주고받는 방식이 TCP이고, 수신측이 데이터를 받는지 안받는지 상관없이 송신측에서 데이터만 전달하면 되는 방식이 UDP이다. 즉 UDP는 수신측과 접속 절차를 거치지 않고 송신측에서 일방적으로 데이터를 보내는 방식으로, 이러한 서비스를 무관계(無關係) 서비스라 하고, 이 무관계 서비스의 통신규약이 UDP이다. 따라서 UDP는 TCP와 달리 데이터의 수신에 대한 책임을 지지 않는다. 이는 송신자는 정보를 보냈지만, 정보가 수신자에게 제때에 도착했는지 또는 정보 내용이 서로 뒤바뀌었는지에 관해서 송신자는 상관할 필요가 없다는 말이다. 또 TCP보다 안정성 면에서는 떨어지지만, 속도는 훨씬 빠르다.
|
'TCPIP' 카테고리의 다른 글
2013.07.08_Inter Process Communication(IPC)_활용. (0) | 2013.07.09 |
---|---|
2013.07.04_멀티태스킹 테스트 (0) | 2013.07.05 |
2013.07.02_sigaction() 함수. (0) | 2013.07.02 |
2013.07.01_TCP(Transfer Control Protocol)_by종영이형 (0) | 2013.07.01 |
2013.06.27_Packet_Analyze_ (0) | 2013.06.27 |