2016-08-05 49 views
-2

我在寫一個簡單的服務器代碼。 運行代碼後,我試圖使用「telnet localhost 8000」連接服務器,並且出現下一個錯誤:「由外部主機關閉的連接」,服務器關閉。 這是我寫的代碼:創建一個新的tcp套接字 - 服務器端

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"); 
} 

感謝。

+1

這是因爲您的服務器在接受連接並打印消息後不執行任何操作。繼續執行您的服務器。此外,返回值的類型應該是標準中定義的「int」。 – MikeCAT

回答

3

這是因爲一旦你接受了連接,就退出導致所有描述符(包括套接字)被關閉的程序。

如果你想對插座做些什麼,你應該在accept調用之後做到這一點。像有一個讀/寫循環。

而且你應該有一個循環,所以你的程序可以接受新的連接,一旦前一個關閉。

相關問題