0
// A simple echo server
// ./server port_no
#include<stdio.h>
#include<stdlib.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<error.h>
#include<strings.h>
#include<unistd.h>
#include<arpa/inet.h>
#define ERROR -1
#define MAX_CLIENTS 2
#define MAX_DATA 1024
main(int argc, char **argv)
{
struct sockaddr_in server;
struct sockaddr_in client;
int sock;
int new;
int sockaddr_len = sizeof(struct sockaddr_in);
int data_len;
char data[MAX_DATA];
if((sock = socket(AF_INET , SOCK_STREAM, 0)) == ERROR)
{
perror("server socket: ");
exit(-1);
}
server.sin_family = AF_INET;
server.sin_port = htons(atoi(argv[1]));
server.sin_addr.s_addr = INADDR_ANY;
bzero(&server.sin_zero,8);
if((bind(sock , (struct sockaddr *)&server, sockaddr_len)) == ERROR)
{
perror("bind : ");
exit(-1);
}
if((listen(sock, MAX_CLIENTS)) == ERROR)
{
perror("listen");
exit(-1);
}
while(1) //Better signal handling required
{
if((new == accept(sock, (struct sockaddr *)&client , &sockaddr_len)) == ERROR)
{
perror("accept");
exit(-1);
}
printf("New Client connected from port no %d and IP %s\n",ntohs(client.sin_port),inet_ntoa(client.sin_addr));
data_len = 1;
while(data_len)
{
data_len = recv(new,data , MAX_DATA, 0);
if(data_len)
{
send(new, data, data_len, 0);
data[data_len] = '\0' ; // null the last byte to detect string
printf("Sent mesg: %s", data);
}
}
printf("Client disconnected\n");
close(new);
}
close(sock);
}
嗨,我一直在學習套接字編程C語言。最近我寫了一個tcp echo服務器的代碼。服務器不顯示連接當我使用netstat命令,但只要我運行代碼使用telnet它開始打印無限的消息,而不是等待我在其他終端寫入消息。請幫我弄清楚我哪裏出錯了。如何阻止我的tcp echo服務器以正確的方式工作?
請告訴我們實際的輸出是什麼。正在打印的信息顯然很重要,因爲它會告訴程序停滯在哪裏。但對於初學者,'while(data_len)'和'if(data_len)'是錯誤的。 'recv'在錯誤時返回'-1',在C中,任何非零值在作爲條件使用時計算結果爲true。所以這些檢查不能正確區分成功和錯誤。 – kaylum