2016-08-05 63 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调用之后做到这一点。像有一个读/写循环。

而且你应该有一个循环,所以你的程序可以接受新的连接,一旦前一个关闭。