0
我有一個回顯服務器和三個客戶端,我需要的是每個客戶端都可以將數據發送到服務器,並且每個數據都可以打印在服務器的三個不同終端。在TCP/IP回顯服務器上的三個遠程終端上打印
我想知道這是否可能以及我需要使用哪些附加功能來實現。我只需要確定我可以使用哪些元素就可以獲得我想要的東西。
我正在用C語言和四臺CentOS電腦。這裏是我的兩個方案的代碼(我omite錯誤處理代碼):
客戶端程序:
int main(int argc, char *argv[])
{
int clientSocket,remotePort,status=0;
struct sockaddr_in ServerName={0};
char buffer[256]="";
char *remoteHost=NULL;
remoteHost=argv[1];
remotePort=atoi(argv[2]);
clientSocket= socket(PF_INET,SOCK_STREAM,IPPROTO_TCP);
ServerName.sin_family=AF_INET;
ServerName.sin_port=htons(remotePort);
ServerName.sin_addr.s_addr=inet_addr=(remoteHost);
status=connect(clientSocket,(struct sockaddr *)&ServerName,sizeof(ServerName));
while(strcmp(buffer,"exit"))
{
scanf("%s",buffer);
write(clientSocket,buffer,strlen(buffer));
read(clientSocket,buffer,sizeof(buffer));
printf("%s\n",buffer);
}
}
服務器程序:
#define BACK_LOG 5
int main(int argc, char *argv[])
{
int serverSocket=0,status=0,clientSocket=0,longitud=0,port;
char buffer[256]="";
struct sockaddr_in serverName,clientName;
buffer[0]='\0';
port=atoi(argv[1]);
serverSocket=socket(AF_INET,SOCK_STREAM,0);
serverName.sin_family=AF_INET;
serverName.sin_port=htons(port);
serverName.sin_addr.s_addr=htonl(INADDR_ANY);
status=bind(serverSocket,(struct sockaddr *)&serverName, sizeof(serverName));
status=listen(serverSocket,BACK_LOG);
int clientLength = sizeof(clientName);
clientSocket=accept(serverSocket,(struct sockaddr *)&clientName, &clientLength);
while(read(clientSocket,buffer,sizeof(buffer))!=0)
{
longitud=strlen(buffer);
printf("%s %i\n",buffer,strlen(buffer));
write(clientSocket,buffer,longitud);
strncpy(buffer,buffer,longitud+1);
}
close(serverSocket);
}
查看'select'系統調用。 – Xymostech
謝謝,我發現了兩個選擇:使用'select'和使用'threads'與'pthread',是處理echo服務器中多個連接的好方法。 – Richard