問題是,無論我設置的端口是什麼,服務器都連接到另一個端口。 例如,在我的代碼中,我設置了端口20000(但我也嘗試了其他數字),但是當我打印端口號時,它完全不同(現在顯示8270) 是這條線是否正確? indirizzo_serv.sin_port=htons(20000);
tcp服務器未綁定到特定端口
另一個問題是服務器不接受多個命令,我的意思是當我發送「時間」並得到答案時,我不能發送任何其他命令。服務器代碼:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<unistd.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<time.h> //per data e ora
#include<locale.h> //per la traduzione di giorno e mese
int main(void)
{
char buf[100]={0},tmp[10]={0};
time_t t; //tempo "grezzo" (rawtime)
struct tm *info; //struttra che contiene le informazioni su data e ora
struct sockaddr_in indirizzo_serv;
int fd1,fd2;
socklen_t len;
setlocale(LC_ALL,"it_IT.utf8"); //per stampare giorno e mese in italiano, ricavato dando da terminale locale -a
indirizzo_serv.sin_family=AF_INET;
indirizzo_serv.sin_port=htons(20000);
indirizzo_serv.sin_addr.s_addr=htonl(INADDR_ANY);
fd1=socket(PF_INET,SOCK_STREAM,0); //socket tcp di rete
bind(fd1,(struct sockaddr*)&indirizzo_serv,sizeof(indirizzo_serv));
listen(fd1,5);
sprintf(tmp,"Numero porta= %d\n",indirizzo_serv.sin_port);
write(STDOUT_FILENO,tmp,strlen(tmp));
bzero(tmp,10);
fd2=accept(fd1,NULL,NULL);
sleep(2);
while(1){
read(fd2,buf,100);
if((strcmp(buf,"TIME\n"))==0){
time(&t);
info=localtime(&t);
strftime(buf,100,"Sono le ore %H.%M%n",info);
write(fd2,buf,strlen(buf));
bzero(buf,100);
}
else if((strcmp(buf,"DATE\n"))==0){
time(&t);
info=localtime(&t);
strftime(buf,100,"Oggi è %A, %e %B %G %n",info);
write(fd2,buf,strlen(buf));
bzero(buf,100);
}
else if((strcmp(buf,"PORT\n"))==0){
indirizzo_serv.sin_port=htons(0); //porta casuale
len=sizeof(indirizzo_serv);
getsockname(fd1,(struct sockaddr*)&indirizzo_serv,&len);
sprintf(tmp,"Numero porta= %d\n",indirizzo_serv.sin_port);
write(STDOUT_FILENO,tmp,strlen(tmp));
write(fd2,tmp,strlen(tmp)); //invio la porta al client sotto forma di stringa
bzero(tmp,10);
}
}
close(fd1);
return 0;
}
客戶端代碼:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<unistd.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<ctype.h> //per toupper
int main(void)
{
struct sockaddr_in indirizzo;
int fd,i=0,nport;
char buf[100]={0};
indirizzo.sin_family=AF_INET;
inet_aton("127.0.0.1",&indirizzo.sin_addr);
indirizzo.sin_port=htons(10000);
fd=socket(PF_INET,SOCK_STREAM,0);
connect(fd,(struct sockaddr*)&indirizzo,sizeof(indirizzo));
while(1){
write(STDOUT_FILENO,"Scrivi il comando da inviare al server tra i seguenti: TIME, DATE, PORT.\n",strlen("Scrivi il comando da inviare al server tra i seguenti: TIME, DATE, PORT.\n"));
read(STDIN_FILENO,buf,sizeof(buf));
while(buf[i]){
buf[i]=toupper(buf[i]);
i++;
}
if((strcmp(buf,"PORT\n"))==0){
bzero(buf,100);
read(fd,buf,sizeof(buf));
nport=atoi(buf);
indirizzo.sin_port=htons(nport);
connect(fd,(struct sockaddr*)&indirizzo,sizeof(indirizzo));
}
write(fd,buf,strlen(buf)); //incio comando al server
bzero(buf,100);
read(fd,buf,100); //leggo il messaggio ricevuto dal server
write(STDOUT_FILENO,buf,strlen(buf)); //stampo a video il messaggio
bzero(buf,100);
}
close(fd);
return 0;
}