TCP Echo Server 练习

建立一个档案名为 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 3002

int main(int argc, char** argv)
{
    int nServerSockFd, nDataSockFd;
    struct sockaddr_in addrServer, addrClient;
    char cRevBuffer[BUFFER_SIZE];
    int nRcvLen;

    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_STREAM, 0);

    if (bind(nServerSockFd, (struct sockaddr*)&addrServer, sizeof(addrServer)) == 1){
        printf("Error: bind()\n");
        return 0;
    }

    if (listen(nServerSockFd, 10) == -1){
        printf("Error: listen()\n");
        return 0;
    }

    socklen_t sLen = sizeof(addrClient);
    nDataSockFd = accept(nServerSockFd, (struct sockaddr *)&addrClient, &sLen);
    if(nDataSockFd == -1){
        printf("Error: accept()\n");
        return 0;
    }

    for(;;){
        memset(cRevBuffer, 0, BUFFER_SIZE);
        nRcvLen = read(nDataSockFd, cRevBuffer, BUFFER_SIZE);

        if(write(nDataSockFd, cRevBuffer, nRcvLen) == -1){
            printf("Error: accept()\n");
            return 0;
        }
    }

    close(nDataSockFd);
    close(nServerSockFd);

    return 0;
}

再次建立一个档案名称为 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 3002

int main(int argc, char **argv)
{
    int nSockFd;
    struct sockaddr_in addrClient, addrServer;
    socklen_t sLen;
    char cSendBuffer[BUFFER_SIZE], cRecvBuffer[BUFFER_SIZE];
    int nRcvLen;

    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");

    nSockFd = socket(AF_INET, SOCK_STREAM, 0);

    if (connect(nSockFd, (struct sockaddr*)&addrServer, sizeof(addrServer)) == -1){
        printf("Error: connect()\n");
        return(0);
    }

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

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

        write(nSockFd, cSendBuffer, BUFFER_SIZE);

        int nLen = read(nSockFd, cRecvBuffer, BUFFER_SIZE);

        printf("Receive %d bytes\n", nLen);
        printf("Echo: %s\n", cRecvBuffer);

    }
    close(nSockFd);
    return 0;
}

再来编译这两个档案

g++ -o client client.cpp
g++ -o server server.cpp

编译完成后开启一个终端机执行 server 端程式

./server

开启另外一个终端机,执行 client 程式并且输入讯息,就可以得到相同的回复了

./client
4A6G0062
SHXJ
Latest posts by SHXJ (see all)

发布留言