2017-04-18 141 views
0

运行时,程序给出在非插座上的插座操作:在设置插座选项和装订插座时出错

在非插座上的插座操作:绑定插座时发生错误。

后,当我用setsockopt() 再次给了我错误:

socket operation on non socket, error while setting options to socket. 
我目前使用Ubuntu 16.04

。 操作系统或我的代码有问题吗? (因为我已经看到我在这里使用 端口没有被任何其他程序,我试图改变 端口号10000和56000也是范围)

#include<stdio.h> 
#include<stdlib.h> 
#include<string.h> 
#include<sys/types.h>    
#include<sys/socket.h>  
#include<netinet/in.h>  
#include<arpa/inet.h>  
#include<errno.h>   

#define PORT 7890 

int main() 
{ 
    int sock_fd, new_sockfd; 
    struct sockaddr_in host_addr, client_addr;    
    socklen_t sin_size; 
    int recv_length, yes = 1; 
    char buffer[1024];          


    if(sock_fd = socket(AF_INET, SOCK_STREAM, 0) == -1)  
    { 
     perror("in creating socket \n"); 
     exit(-1); 
    } 
    else 
     printf("Socket: SUCCESS \n"); 

    if(setsockopt(sock_fd, SOL_SOCKET, SO_REUSEADDR, &yes,sizeof(int)) == -1) 
     perror("while setting socket option SO_REUSEADDR \n"); 
    else 
     printf("Socket Option: SUCCESS \n"); 



    host_addr.sin_family = AF_INET;    
    host_addr.sin_port = htons(PORT);   
    host_addr.sin_addr.s_addr = 0;    
    memset(&(host_addr.sin_zero), '\0', 8);  




    if(bind(sock_fd, (struct sockaddr *)&host_addr, sizeof(struct sockaddr)) == -1) 
     perror("while binding \n"); 
    else 
     printf("Binding: SUCCESS \n"); 


    if(listen(sock_fd, 5) == -1) 
     perror("while listening \n"); 
    else 
     printf("Listen: SUCCESS \n"); 


    while(1) 
    { 

     sin_size = sizeof(struct sockaddr_in); 

     new_sockfd = accept(sock_fd, (struct sockaddr *)&client_addr, &sin_size); 

      if(new_sockfd == -1) 
      { 
       perror("failed to accept \n"); 
       exit(-1); 
      } 
      else 
       printf("accept: SUCCESS \n"); 
      printf("Server got connction from IP ADDRESS: %s, PORT NUMBER:%d \n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port)); 
    send(new_sockfd, "HELLO BASTARDS !\n", 16, 0); 

     recv_length = recv(new_sockfd, &buffer, 1024, 0); 

      while(recv_length > 0) 
      { 
       printf("Recieved %d Bytes \n", recv_length); 



       recv_length = recv(new_sockfd, &buffer, 1024, 0);      
      } 

     close(new_sockfd); 
    } 




return 0; 
} 
+4

这个'如果(sock_fd =插座(AF_INET,SOCK_STREAM,0)== -1)'不会做你期望的。注意运营商的优先顺序。 '=='绑定比'='更紧密。 – alk

回答

0

常用运算符优先级问题:

if(sock_fd = socket(AF_INET, SOCK_STREAM, 0) == -1)  

应该

if((sock_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1)  
+1

为什么这个错误在网络代码中一遍又一遍地重复了呢?他们为什么着迷于出现错误的复合布尔表达式?开发人员是否懒得使用两条可以轻松调试的代码?挡住我:( – ThingyWotsit