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)

發佈留言