我正在嘗試編寫一個TCP Echo程序,該程序應該打開一個TCP服務器套接字,接受至少1個連接,並回顯接收到的任何數據。至少,這個程序應該啓動並運行在一個指定的端口(exe:port 4444「)。理想情況下,它會要求一個端口號(從命令行,命令行參數或配置文件)嘗試在該端口上打開,並報告是否發生錯誤編寫一個TCP回聲程序?
該程序應該使用來自Windows或Linux的telnet命令或任何操作系統中的任何終端仿真程序進行測試,使用Telnet或超級終端連接到正在運行的程序。在應立即回顯
到目前爲止,我有以下幾點:。
#include <stdio.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <netinet/in.h>
#include <errno.h>
#define MAXCONNECTING 1000 //Max connection requests
#define BUFFERSIZE 128 //limits data sent per loop
#define ECHOPORT 4444
//Error checking function
//Will be called multiple times to check for errors throughout the code
void ERR(char *ERROR) {
perror(ERROR);
exit(1);
}
/****************************************************************************
* Handles the connection. Receive/Send data from/to client
****************************************************************************/
void ClientHandle(int sock) {
char buffer[BUFFERSIZE];
int received = -1;
//receive the data
if ((received = recv(sock, buffer, BUFFERSIZE, 0)) < 0) {
ERR("Failed to receive message from client");
}
//send data and check for more incoming data
while (received > 0) {
if (send(sock, buffer, received, 0) != received) {
ERR("Failed to send data to client");
}
if ((received = recv(sock, buffer, BUFFERSIZE, 0)) < 0) {
ERR("Failed to receive additional data from client");
}
}
close(sock);
}
int main(int argc, char *argv[]) {
/****************************************************************************
* Get port number from command line and set to default port
****************************************************************************/
char *endptr;
short int port;
if (argc == 2) {
port = strtol(argv[1], &endptr, 0);
if (*endptr) {
fprintf(stderr, "EchoServer: Invalid Port Number.\n");
exit(EXIT_FAILURE);
}
} else if (argc < 2) {
port = ECHOPORT; //port 4444
} else {
fprintf(stderr, "EchoServer: Invalid arguments.\n");
exit(EXIT_FAILURE);
}
/****************************************************************************
* Server Configuration. Creating the socket
****************************************************************************/
int serversock, clientsock;
struct sockaddr_in echoserver, echoclient;
if (argc != 2) {
fprintf(stderr, "USING: echoserver Port: 4444\n");
exit(1);
}
//Creating the TCP socket
if ((serversock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) {
ERR("Failed to create socket");
}
//Constructing the server sockaddr_in structure
memset(&echoserver, 0, sizeof(echoserver)); //clear struct
echoserver.sin_family = AF_INET; //internet ip
echoserver.sin_addr.s_addr = htonl(INADDR_ANY); //listen to any ip address
echoserver.sin_port = htons(atoi(argv[1])); //server port
/*****************************************************************************
* Bind and Listen
*****************************************************************************/
if (bind(serversock, (struct sockaddr *) &echoserver, sizeof (echoserver)) < 0) {
ERR("Failed to bind the server socket");
}
if (listen(serversock, MAXCONNECTING) < 0) {
ERR("Failed to listen on server socket");
}
/*****************************************************************************
* Accepting the transmission
*****************************************************************************/
while (1) {
unsigned int clientleng = sizeof (echoclient);
if ((clientsock = accept(serversock, (struct sockaddr *) &echoclient, &clientleng)) < 0) {
ERR("Failed to accept connection from client");
}
fprintf(stdout, "Client connected: %s\n", inet_ntoa(echoclient.sin_addr));
ClientHandle(clientsock);
}
return (0);
}
/*****************************************************************************************/
任何人都可以看到w ^我在這裏出錯了?我可以使用以下命令在終端找到該程序:G ++ EchoServer.cpp -0 EchoServer的,然後依次爲:./EchoServer
的輸出中只給了我: 使用:EchoServer的端口:4444
我想telnet到它,但我對這個東西很新。請幫忙!!
正如你所寫的那樣,你應該把它作爲一個參數給監聽端口,也就是說你可以將它作爲'./EchoServer 4444'來啓動。你還有什麼其他的具體問題? – nos 2012-07-18 20:42:58
對不起,我不明白你的意思。我對這個東西非常陌生,因爲昨天是我第一次被介紹給套接字。你能舉個例子嗎? – Zonxwedop 2012-07-18 21:39:04
爲了回答,我特別想讓它到達我可以在命令提示符下寫入一行的位置,然後按回車鍵,程序就會迴應我寫的內容。 – Zonxwedop 2012-07-18 21:49:49