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)

发布留言