2012-09-28 32 views
0

我遇到了运行一小块代码的问题。这是关于在C编程的套接字编程。我想要做的是让客户端与两个不同端口上的服务器进行通信。但是,当我试图编译客户端代码时,我得到'分段错误'。我在这里给我的客户代码。请让我知道发生了什么问题。段错误 - 套接字编程

#include<stdio.h> 
    #include<stdbool.h> 
    #include<string.h> 
    #include<stdlib.h> 
    #include<time.h> 
    #include <sys/types.h> 
    #include <sys/socket.h> 
    #include <netinet/in.h> 
    #include <netdb.h> 

    int main(int argc,char *argv[]) 
    { 
    int sockfd,newsockfd,sockfd_infinite,sockfd_kitchen,portno,portno1,n,no_of_tables; 
    struct sockaddr_in serv_addr,kitchen_addr; 
    struct hostent *server,*kitchen; 
    struct timeval time_out; 
    time_out.tv_sec = 15; // 15 seconds 
    time_out.tv_usec = 0; // 0 milliseconds 
    //  server=gethostbyname(argv[1]); 
    //  char buffer[256]; 
    portno=atoi(argv[2]); 
    portno1=atoi(argv[4]); 
    sockfd=socket(AF_INET,SOCK_STREAM,0); 
    if(sockfd==-1) 
      error("\nError creating socket"); 
    server=gethostbyname(argv[1]); 
    serv_addr.sin_family=AF_INET; 
    serv_addr.sin_port=htons(portno); 
    bcopy((char *)server->h_addr, 
      (char *)&serv_addr.sin_addr.s_addr, 
      server->h_length); 

    sockfd_kitchen=socket(AF_INET,SOCK_STREAM,0); 
    if(sockfd_kitchen==-1) 
      error("\nError creating socket"); 
    kitchen=gethostbyname(argv[3]); 
    kitchen_addr.sin_family=AF_INET; 
    kitchen_addr.sin_port=htons(portno1); 
    bcopy((char *)kitchen->h_addr, 
      (char *)&kitchen_addr.sin_addr.s_addr, 
      kitchen->h_length); 

    n=connect(sockfd_kitchen,(struct sockaddr *)&kitchen_addr,sizeof(kitchen_addr)); 
    if(n==-1) 
      error("\nError connecting to kitchen"); 
    n=connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(serv_addr)); 
    if(n==-1) 
      error("\nError connecting to server"); 
    return 0; 
    } 

所以这个代码背后的想法是 - 有一个客户端,并有一个服务器。该客户端想要在两个不同的端口上与服务器通信,就好像客户端正在与两台不同的服务器交谈。我在我的笔记本电脑上为服务器名称和不同的端口号在服务器名称中设置为'localhost'。就像你在我的代码中看到的一样,我有两个服务器的指针变量,即* server和* kitchen。

如: ./thiscode本地主机15535本地主机12345

在我所提到的例子,这是我怎么编译我的客户端代码。 argv [1]是第一个“localhost”(服务器名称),argv [2]是第一个服务器的端口号。第二个“localhost”和“12345”是第二个服务器的名称和端口号。

就像我以前说过的,我试图在我的笔记本电脑上运行三个不同代码的窗口(一个用于客户端,另一个用于服务器)。我的两个服务器代码编译没有任何问题,但我的客户端代码得到这个'分段'错误。请让我知道我要去哪里错了。 谢谢。

+1

短的编译器中的一个错误,你_not_得到一个SEGV当你编译。你跑步的时候就会得到它。在那里,我已经达到了一天的配套定额:-) – paxdiablo

+0

当你在程序崩溃,分段错误或任何其他情况下,作为程序员的第一反应应该是在调试器中运行你的程序。它将帮助您找到崩溃的位置,并让您检查变量以帮助您找出事故原因。 –

+0

几点意见:(1)你的代码在使用argv之前没有检查argc,所以如果你运行程序时没有参数,那么你会在那里溢出。 (2)即使给出了正确的参数个数,你也应该检查它们是否被正确解析。 (3)valgrind在运行此代码时会产生大量输出,因此您应该遵循Joachim的建议。 –

回答

0

一开始,则应该从gethostbyname被检查返回值:

的的gethostbyname()和gethostbyaddr()函数返回hostent结构或一个NULL指针如果发生错误。出错时,h_errno变量保存一个错误号。

+0

我没有用HOST_NOT_FOUND值检查h_errno。对于C中的普通服务器 - 客户端套接字编程,即使h_errno等于HOST_NOT_FOUND,我仍然可以在服务器和客户端之间传输数据。我不清楚这是怎么发生的! – Richard

+1

@Richard,'h_errno'(就像'errno')是不相关的_unless返回值表示错误。_否则,它可以设置为_any_值。换句话说,检查函数是否返回NULL,并且只有在函数返回NULL时才查看'h_errno'。 – paxdiablo

0

看来问题出在bcopy()函数调用。

在将东西复制到它之前,您还没有为变量声明空间,因此您看到了分段错误

bcopy()语句之前输入以下代码删除赛格故障:

serv_addr.sin_addr.s_addr=malloc(sizeof(unsigned long));