[Linux] IPC : Named Local Socket 통신 소스(PF_LOCAL, SOCK_STREAM) [Sample Source, Example]
반응형
Local Socket 을 사용하여 두개의 Processor 가 통신을 하는 것에 대한 예제 샘플이다.
Server와 Client 두개는 동일한 path를 참조해야 통신이 된다는 것을 먼저 알려드립니다.
Test_Named_Socket_Client.tar.gz
Test_Named_Socket_Server.tar.gz
소스 설명은 주석을 참고하시면 됩니다.
소켓 관련 설명이 잘되어 있는 블러그들이 많이 있습니다.
참고하세요.
http://mintnlatte.tistory.com/267
Result
Server 측 소스
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | #include <iostream> #include <sys/types.h> #include <sys/socket.h> #include <stdio.h> #include <sys/un.h> #include <unistd.h> #include <stdlib.h> using namespace std; #define NAMED_SOCKET_PATH "/home/harry1/workEclipse/Test_Socket_Server/Debug/testLocalSocket" int main() { int serverSocketFd = 0; int clientSocketFd = 0; int serverAddrSize = 0; socklen_t clientAddrSize = 0; struct sockaddr_un serverAddress; struct sockaddr_un clientAddress; // Remove old socket_fd unlink(NAMED_SOCKET_PATH); //Server Socket FD 할당 serverSocketFd = socket(PF_LOCAL, SOCK_STREAM, 0); //Socket bind 준비 및 소켓 명명 memset(&serverAddress, 0, sizeof(serverAddress)); serverAddress.sun_family = AF_LOCAL; strcpy(serverAddress.sun_path, NAMED_SOCKET_PATH); serverAddrSize = sizeof(serverAddress); bind(serverSocketFd, (struct sockaddr *) &serverAddress, serverAddrSize); //연결 보류 대기 사이즈가 5인 연결 대기열을 만든다. listen(serverSocketFd, 5); //클라이언트 접속 대기를 한다. accept() 호출 후 block 되고, 연결되면 해제된다. char ch; cout << "waiting connection from client." << endl; memset(&clientAddress, 0, sizeof(clientAddress)); clientAddrSize = sizeof(clientAddress); clientSocketFd = accept(serverSocketFd, (struct sockaddr *) &clientAddress, &clientAddrSize); cout << "connection with client." << endl; //wait and Read 1 byte from client. read(clientSocketFd, &ch, 1); cout << "received data : " << ch << endl; // write received 1 byte to Client. write(clientSocketFd, &ch, 1); cout << "echo ch:" << ch << endl; // close socket close(serverSocketFd); // Remove socket_fd unlink(NAMED_SOCKET_PATH); return 0; } | cs |
Client 측 소스
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | #include <iostream> #include <sys/types.h> #include <sys/socket.h> #include <stdio.h> #include <sys/un.h> #include <unistd.h> #include <stdlib.h> using namespace std; #define NAMED_SOCKET_PATH "/home/harry1/workEclipse/Test_Socket_Server/Debug/testLocalSocket" int main() { int socketFd = 0; struct sockaddr_un address; int result = 0; char ch = 'E'; char readCh = 'A'; int addSize =0; //Socket FD 할당 socketFd = socket(PF_LOCAL, SOCK_STREAM, 0); //Socket 연결 준비 및 연결 시도 memset(&address,0, sizeof(address)); address.sun_family = AF_LOCAL; strcpy(address.sun_path, NAMED_SOCKET_PATH); addSize = sizeof(address); result = connect(socketFd, (struct sockaddr *) &address, addSize); if(result == -1){ cout << "Error : Connection Failed." << endl; exit(EXIT_FAILURE); } // write 1 byte cout << "Send Data to Server." << endl; write(socketFd, &ch, 1); // Read 1 byte. read(socketFd, &readCh, 1); cout << " received data:" << readCh << endl; close(socketFd); exit(EXIT_SUCCESS); } | cs |
반응형
'IT > Linux' 카테고리의 다른 글
[Ubuntu 14.04] Cmake 3.2 upgrade / install (0) | 2017.08.31 |
---|---|
[Ubuntu] 구글 크롬 Shell로 설치하기 (How to install Google Chrome on shell) (0) | 2017.01.15 |
[Linux] IPC : Message Queue 메시지 대기열 방식 데이터 전달 Sample Source, Example (0) | 2016.11.29 |
[Linux] IPC : Shared Memory 통신 Example Source [Client / Server] (0) | 2016.11.29 |
[Ubuntu] Eclips CDT (C, CPP, C++) 환경설정 (0) | 2016.08.18 |