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)

發佈留言