Echo Socket 練習

建立一個檔案 client.cpp 並貼上以下程式碼

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#define BUFFER_SIZE 512
#define SERVER_PORT 3001

int main(int argc, char **argv)
{
    int nSocket = 0;
    int nStrLen = 0;
    struct sockaddr_in addrServer, addrClient;
    char cSendBuffer[BUFFER_SIZE], cRecvBuffer[BUFFER_SIZE];

    memset(&addrClient, 0, sizeof(addrClient));
    memset(&addrServer, 0, sizeof(addrServer));

    addrServer.sin_family = AF_INET;
    addrServer.sin_port = htons(SERVER_PORT);

    if (argc>=2)
        addrServer.sin_addr.s_addr = inet_addr(argv[1]);
    else
        addrServer.sin_addr.s_addr = inet_addr("127.0.0.1");
    
    nSocket = socket(AF_INET, SOCK_DGRAM, 0);
    socklen_t nLen = sizeof(struct sockaddr);

    for(;;) {
        printf("Please Input Mesage:");
        fgets(cSendBuffer, BUFFER_SIZE, stdin);

        if (strncmp(cSendBuffer, "exit", 4) == 0) break;

        nStrLen = strlen(cSendBuffer);
        sendto(nSocket, cSendBuffer, nStrLen+1, 0, (struct sockaddr *) &addrServer, nLen);

        int nLen = recvfrom(nSocket, cRecvBuffer, BUFFER_SIZE, 0, NULL, NULL);
        printf("Receive %d bytes\n", nLen);
        printf("Echo: %s\n", cRecvBuffer);
    }
    return 0;
}

再來建立一個檔案 server.cpp 並貼上以下程式碼

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#define BUFFER_SIZE 512
#define SERVER_PORT 3001

int main(int argc, char **argv)
{
    int nServerSockFd;
    struct sockaddr_in addrServer, addrClient;
    socklen_t nLen = sizeof(struct sockaddr);
    char cRevBuffer[BUFFER_SIZE];

    memset(&addrClient, 0, sizeof(addrClient));
    memset(&addrServer, 0, sizeof(addrServer));

    addrServer.sin_family = AF_INET;
    addrServer.sin_port = htons(SERVER_PORT);

    if (argc >= 2)
        addrServer.sin_addr.s_addr = inet_addr(argv[1]);
    else
        addrServer.sin_addr.s_addr = inet_addr("127.0.0.1");

    nServerSockFd = socket(AF_INET, SOCK_DGRAM, 0);

    bind(nServerSockFd, (struct sockaddr *)&addrServer, sizeof(addrServer));

    for (;;){
        int nReadBytes =recvfrom(nServerSockFd, cRevBuffer, sizeof(cRevBuffer), 0, 
        (struct sockaddr *)&addrClient, &nLen);
        sendto(nServerSockFd, cRevBuffer, nReadBytes, 0, (struct sockaddr *)&addrClient, nLen);
    }
    return 0;
}

編譯這兩個檔案

sudo apt install g++ -y
g++ -o udpEchoClient client.cpp
g++ -o udpEchoServer server.cpp

執行 SERVER

./udpEchoServer
Server 不會出現任何訊息

開啟另外一個終端機,執行 client

./udpEchoClient
使用者打什麼伺服器就回應什麼,輸入 exit 可以離開。
SHXJ
Latest posts by SHXJ (see all)

發佈留言