2016-08-05 52 views
-2

Ich schreibe einen einfachen Server-Code. Nach dem Ausführen des Codes, versuche ich den Server mit "Telnet Localhost 8000" verbinden und ich bekomme den nächsten Fehler: "Verbindung von fremden Host geschlossen" und der Server schließt. dies ist der Code, den ich schrieb:Erstellen eines neuen TCP-Sockets - Serverseite

void main(int argv,void * argc) 
{ 

//int socket(int af, int type, int protocol); 

    int listen_sckt; 
    int new_socket; 
    int addrlen; 
    struct sockaddr_in addr; 
/* 
#include <netinet/in.h> 

struct sockaddr_in { 
    short   sin_family; // e.g. AF_INET 
    unsigned short sin_port;  // e.g. htons(3490) 
    struct in_addr sin_addr;  // see struct in_addr, below 
    char    sin_zero[8]; // zero this if you want to 
}; 

struct in_addr { 
    unsigned long s_addr; // load with inet_aton() 
}; 

*/  

    listen_sckt = socket(AF_INET,SOCK_STREAM,0); 
    if(listen_sckt == -1){ 
     perror("SOCKET ERR\n"); 
     return; 
    } 
    printf("Socket succesfulyl opened\n"); 
{ 
/* 
binding a docket 
syntax: 
int bind(int s, struct sockaddr *addr, int addrlen); 
connect the socket to a logic port. 
so the other side will know where to "find" the other side 
*/ 
} 
    addr.sin_family = AF_INET;x` 
    addr.sin_addr.s_addr = INADDR_ANY; 
    addr.sin_port = htons(8000); 
    //binding command 
    if(-1 == bind(listen_sckt,(struct sockaddr*)&addr,sizeof(addr))){ 
     perror("BINDING ERR\n"); 
    } 
    printf("Binding succesfully done\n"); 

/* Listen() 
Before any connections can be accepted, the socket must be told to listen 
for connections and also the maximum number of pending connections using listen() 

Includes: 

#include <sys/socket.h> 

Syntax: 
int listen(int socket, int backlog); 
socket - the socket file descriptor 
backlog - the max number of pedding the socket will hold 

C source: 
*/ 

    listen(listen_sckt,2); 
/* 
To actually tell the server to accept a connection, you have to use the function accept() 

Includes: 

#include <sys/socket.h> 

Syntax: 

int accept(int s, struct sockaddr *addr, int *addrlen); 
*/ 
    addrlen = sizeof(struct sockaddr_in); 
    new_socket = accept(listen_sckt,(struct sockaddr*)&addr,&addrlen); 
    if(new_socket<0){ 
     perror("Accept ERR\n"); 
    }  
    printf("Acept success\n"); 
} 

Dank.

+1

Dies liegt daran, dass Ihr Server nach dem Akzeptieren einer Verbindung und dem Drucken einer Nachricht nichts unternimmt. Fahren Sie mit der Implementierung Ihres Servers fort. Außerdem sollte der Typ des Rückgabewerts "int" sein, was im Standard definiert ist. – MikeCAT

Antwort

3

Das liegt daran, dass Sie, sobald Sie die Verbindung akzeptiert haben, das Programm beenden, wodurch alle Deskriptoren (einschließlich Sockets) geschlossen werden. Wenn Sie etwas mit dem Socket machen wollen, sollten Sie dies nach dem accept Anruf tun. Wie eine Lese-/Schreibschleife.

Und Sie sollten wahrscheinlich eine Schleife um das Ganze haben, so dass Ihr Programm neue Verbindungen akzeptieren kann, sobald das vorherige geschlossen ist.