2012-12-11 242 views
2

事情是这样的,我写在C简单的TCP套接字服务器(使用UNIX系统调用),我是不是能够得到接受连接。Unix下C套接字服务器不接受连接

从我可以告诉,我通过服务器初始化拿到就好了,但是当我尝试连接到我打印出来的端口(见下面的代码)它拒绝仿佛无所不有。

更重要的是,当我用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**/ 

} 
+1

你检查的iptables和SELinux的? – anishsane

+1

检查您的防火墙是否阻止了这些端口。 – askmish

+0

已检查并清除。他们是内核通过请求到插座为“0”,所以我想象这是绑定的情况下自动分配的端口,但它是值得一试又 – darkpbj

回答

1

道具@askmish为激励这一

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

成为

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

你真的想试听端口零吗?尝试一个高端口号,最好> 1024./etc/services会给出一个关于空闲端口的提示 - 但它只是一组注释,这些端口号不会被强制执行。

编辑:另一条线索。端口号应为网络订单,所以分配应使用htons()。可能是因为你可能在小端机器上(比如英特尔),所获得的“随机数”是简单的数字,显示为乱码。当你打印它们时,使用ntohs()将它们转换回来。

+0

如果你试图在端口零听...我很惊讶'绑定'成功 – Useless

+0

嗯,我认为绑定到0(bind(2))会自动分配一个端口。我在检查套接字描述符之前调用getsockname以确保发生这种情况。 (即良好的捕捉,但我确认这在代码中是可以的) – darkpbj

+1

@darkpbj它在手册中说了什么?如果绑定分配了一些任意的端口,你怎么知道要连接哪一个端口? – iabdalkader

1

在您的代码:

  • 相反的:

    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 
    } 
    

如果没有这些解决您的问题,那么,可能有问题与客户端代码或您的服务器环境。

+0

所有好的建议,并通过它的工作帮助我得出我刚刚发布的答案 – darkpbj

相关问题