3

这是交易,我正在用 C 语言(使用 unix 系统调用)编写一个简单的 tcp 套接字服务器,但我无法接受连接。

据我所知,我很好地完成了服务器初始化,但是当我尝试连接到我打印出来的端口(见下面的代码)时,它拒绝了,好像什么都没有。

更重要的是,当我 netstat 甚至没有使用该端口时。我目前的设置并没有抛出任何错误,我已经完全没有想法了。

int main(){

    int sock_fd;
    int conn_fd;
    struct sockaddr_in serv_addr;
    struct sockaddr_in cli_addr;
    socklen_t* serlen;
    socklen_t* clilen;
    clilen  = malloc(sizeof(socklen_t));
    serlen  = malloc(sizeof(socklen_t));
    *serlen = sizeof(serv_addr);
    *clilen = sizeof(cli_addr);

    /*=============================Create Socket=============================*/


        //Create Socket
        sock_fd = socket(AF_INET, SOCK_STREAM, 0);
            if(sock_fd<0){
                fprintf(stderr,"error creating socket\n");
                exit(1);}

        //Initialize Server Address Struct
        bzero((char *) &serv_addr, *serlen);
        serv_addr.sin_family = AF_INET;
        serv_addr.sin_addr.s_addr = INADDR_ANY;
        serv_addr.sin_port = 0;

    /*=============================Bind Address==============================*/

        //Bind socket to an address
        if(bind(sock_fd,(struct sockaddr*)&serv_addr,*serlen)<0){
            fprintf(stderr,"error binding\n");
            exit(1);}

        //Get socket data
        if(getsockname(sock_fd,(struct sockaddr*)&serv_addr, serlen)<0){
            fprintf(stderr,"error with socket name");
            exit(1);}

    /*=============================Server Started============================*/

        //Listen for connections
        listen(sock_fd,32);

        //Print port
        printf("%i", serv_addr.sin_port);

        conn_fd = accept(sock_fd,(struct sockaddr*)&cli_addr,clilen);

        /**Do something exciting with my new connection**/

}
4

3 回答 3

5

你真的想在零端口上监听吗?尝试使用较高的端口号,最好 > 1024。/etc/services 会提示有关空闲端口 - 但它只是一组注释,这些端口号不强制执行。

编辑:另一个提示。端口号应按网络顺序排列,因此分配应使用htons(). 您获得的“随机数”可能是简单的数字,因为您可能使用的是 little-endian 机器(如 Intel),所以它们看起来是乱码。当您打印它们时,使用ntohs().

于 2012-12-11T08:51:51.533 回答
3

给@askmish 的道具以激发这个灵感

    //Print port
    printf("%i", serv_addr.sin_port);

变成

    //Print port
    printf("%i", htons(serv_addr.sin_port));
于 2012-12-11T10:10:25.810 回答
2

在您的代码中:

  • 代替:

    serv_addr.sin_port = 0;
    

    试试这个:

    serv_addr.sin_port=htons(2056);//Any port no. 
    
  • 代替:

     listen(sock_fd,32);
    

    试试这个:

     if(listen(sock_fd,SOMAXCONN)<0)//Just to be sure that you are considering max. no. of requests
     {  fprintf(stderr,"error with listen");
        exit(1);}
    
  • 也适用于:

     conn_fd = accept(sock_fd,(struct sockaddr*)&cli_addr,clilen);
    

    添加这个:

     if(conn_fd <0)
     {
       //handle the error here
     }
    

如果这些都不能解决您的问题,那么客户端代码或您的服务器环境可能存在问题。

于 2012-12-11T09:49:11.053 回答