[Linux] IPC : Named Local Socket 통신 소스(PF_LOCAL, SOCK_STREAM) [Sample Source, Example]

Posted by [하늘이]
2016. 12. 2. 19:38 IT/Linux
반응형

Local Socket 을 사용하여 두개의 Processor 가 통신을 하는 것에 대한 예제 샘플이다.


Server와 Client 두개는 동일한 path를 참조해야 통신이 된다는 것을 먼저 알려드립니다.


Test_Named_Socket_Client.tar.gz

Test_Named_Socket_Server.tar.gz



소스 설명은 주석을 참고하시면 됩니다.

소켓 관련 설명이 잘되어 있는 블러그들이 많이 있습니다.

참고하세요.

http://mintnlatte.tistory.com/267

http://terapi.tistory.com/76



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, 0sizeof(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, 0sizeof(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,0sizeof(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


반응형