2013-01-01 74 views
0

這是我第一次嘗試編寫網絡程序。它編譯沒有問題,但是當我運行它時,它給了我一個'分段錯誤11'。我希望有人能夠讓我知道代碼中可能導致這個問題的原因。分割故障11 - 網絡程序

我在C.

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

int main() 
{ 
    ////////////  GETADDRINFO \\\\\\\\\\\\\\\\ 

    struct addrinfo hints, *res; 
    memset(&hints, 0 , sizeof hints); 

    hints.ai_family  = AF_UNSPEC; //define the 'hints' strucure 
    hints.ai_socktype = SOCK_STREAM; //define the 'hints' strucure 
    hints.ai_protocol = AI_PASSIVE; //define the 'hints' strucure 

    char *ipaddr = "127.0.0.1"; 
    getaddrinfo(ipaddr, "ftp", &hints, &res); 

    //////////////  SOCKET  \\\\\\\\\\\\\\\\ 

    int sock = socket(AF_INET, SOCK_STREAM, 0); 

    struct sockaddr_in info; 
    int bnd = bind(sock , res->ai_addr, res->ai_addrlen); 

    info.sin_family   = AF_INET; 
    info.sin_port   = htons(10000); 
    info.sin_addr.s_addr = INADDR_ANY; 
    bzero(&(info.sin_zero),8); 


    /////////////// CONNECT \\\\\\\\\\\\\\\\\\\\\\ 

    int conct = connect(sock, res->ai_addr, res->ai_addrlen); 

    //////////////  LISTEN  \\\\\\\\\\\\\\\\\\ 

    int lstn = listen(sock , 4); 

    ////////////// ACCEPT \\\\\\\\\\\\\\\\\\\\\\\ 

    int new_fd; 
    struct sockaddr_storage client_addr; 
    socklen_t addr_size; 
    addr_size = sizeof(client_addr); 
    new_fd = accept(sock, (struct sockaddr *)&client_addr, &addr_size); 

    ///////////////// SEND \\\\\\\\\\\\\\\\\\\\\\ 

    char *msg = "HI!"; 
    int len, bytes_sent; 
    len = strlen(msg); 
    bytes_sent = send(sock, msg, len, 0); 

    //////////////// RECEIVE \\\\\\\\\\\\\\\\\ 

    char burr[254]; 
    int cat = sizeof(burr); 

    recv(sock, burr , cat , 0); 

    printf("%s", burr); 
    return 0; 
} 
+0

你需要找出確切的所在行失敗,以'printf'等。這是怎麼調試工作。 – jn1kk

+0

您不是錯誤檢查可能失敗的函數,例如'getaddrinfo()'或'recv()'。如果'getaddrinfo()'失敗,它可以很容易地解決分段錯誤。 –

+0

@JonathanLeffler yeeeaah,我犯了懶惰。我想快速寫一些東西來測試它。感謝您的信息 –

回答

4

是新出現的段錯誤起初bind因爲getaddrinfo返回的時間誤差這個res結構是無效的。

通過getaddrinfo返回的錯誤是

EAI_SOCKTYPE

請求的套接字類型不被支持。例如,如果hints.ai_socktype和hints.ai_protocol不一致(例如,分別爲SOCK_DGRAM和IPPROTO_TCP),就可能發生這種情況。

您已在hints.ai_protocol = AI_PASSIVE中設置,這是不正確的。該手冊說:

ai_protocol該字段指定返回的套接字地址的協議。在此字段中指定0表示使用getaddrinfo()可以返回具有任何協議的套接字地址。

所以你應該將它設置爲0,如果你想獲得任何協議。

雖然刪除了段錯誤,但程序混亂且不正確。

另請注意:

您正在使用偵聽器套接字發送和接收。你應該使用由accept返回的套接字,它在你的代碼中是new_fd,因爲它是在之間建立的通道,因此它是sendrecv

您已經定義並初始化結構info並從未使用它。

看一看這個,這可能幫助你快速進入插座:http://beej.us/guide/bgnet/