2017-07-27 65 views
0

最近我一直在試圖用C套接字做很多事情,因爲它是一種我將來需要使用的語言。但是我遇到了這個我無法解決的問題。我做了客戶端和服務器 - 不幸的是,兩個二進制文件拒絕相互連接。我的意思是,當我在同一臺計算機上運行服務器二進制和客戶端二進制文件時,我不會收到任何錯誤,但無法連接。有任何想法嗎?這是代碼!C socket(Linux)不會連接

(Ubuntu中,用gcc,服務器和客戶端的代碼編譯的兩個Ç代碼在2個不同的端子在同一機器內跑)

Server.c:

#include <stdio.h> 
    #include <stdlib.h> 
    #include <unistd.h> 
    #include <string.h> 
    #include <sys/socket.h> 
    #include <arpa/inet.h> //inet_aton(), inet_ntoa() etc 
    #include <sys/types.h> 
    #include <netinet/in.h> 

    #define PORT 8000 
    #define ERROR perror("Something went wrong! => "); 
    #define BUFFERSIZE 256 
    int main() 
    { 
     int sockfd, client_socketfd; 
     int bytes_sent; 
     socklen_t sin_size; 
     struct sockaddr_in server_addr; 
     struct sockaddr_in connectedClient_addr; 
     char message[BUFFERSIZE] = "Welcome to the server!"; 

     if((sockfd = socket(PF_INET, SOCK_STREAM ,0)) == -1) { 
      ERROR; 
      exit(-1); 
     } 

     server_addr.sin_family = AF_INET; 
     server_addr.sin_port = htons(PORT); 
     server_addr.sin_addr.s_addr = INADDR_ANY; //Subject to change 


     if((bind(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr))) == -1) { 
      ERROR; 
      exit(-2); 
     } 


     if((listen(sockfd, 5)) == -1) { 
      ERROR; 
      exit(-3); 
     } 

     int addrlen = sizeof(connectedClient_addr); 
     if((client_socketfd = accept(sockfd, (struct sockaddr *)&connectedClient_addr, (socklen_t*)&addrlen)) == -1){ 
      ERROR; 
      exit(-4); 
     } 

     printf("Got a connection from: %s at port: %d" , inet_ntoa(connectedClient_addr.sin_addr), PORT); 

     if((send(sockfd, &message, BUFFERSIZE, 0)) == -1) { 
      ERROR; 
      exit(-5); 
     } 

     close(sockfd); 
     close(client_socketfd); 

     return 0; 
    } 

-

Client.c:

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


#define PORT 8000 
#define ERROR perror("Something went wrong! =>"); 
#define BUFFERSIZE 256 
int main() 
{ 
    int sockfd; 
    struct sockaddr_in client_addr; 
    char message[BUFFERSIZE] = "Successfully connected!"; 
    int bytes_received, bytes_sent; 
    char buffer[BUFFERSIZE]; 


    if((sockfd = socket(PF_INET, SOCK_STREAM, 0)) == -1) { 
     ERROR; 
     exit(-1); 
    } 


    client_addr.sin_family = AF_INET; 
    client_addr.sin_port = htons(PORT); 
    client_addr.sin_addr.s_addr = INADDR_ANY; 


    if((connect(sockfd, (struct sockaddr*)&client_addr, sizeof(client_addr))) == -1) { 
     ERROR; 
     exit(-2); 
    } 

    if((bytes_received = recv(sockfd, &buffer, BUFFERSIZE, 0)) == -1) { 
     ERROR; 
     exit(-3); 
    } 

    printf("Received %d bytes:\n" , bytes_received); 
    printf("%s", buffer); 

    close(sockfd); 

    return 0; 
} 
+2

對於'連接'調用你必須指定一個*特定的地址*。 –

+1

在這一行中,在客戶端代碼中:'client_addr.sin_addr.s_addr = INADDR_ANY;',您試圖將客戶端連接到任何地址。你需要指定你想連接的IP地址 – HatsuPointerKun

+0

@HatsuPointerKun謝謝,現在就試試吧。 – RamonSS

回答

0

答案: 問題是我在server.c中提供了send()函數中的服務器套接字,而不是客戶端套接字。因此代碼工作沒有任何錯誤,但行爲不正確。值得信任的是RemyLebeauin the comments誰指出了這一點,併爲我節省了無數小時的更多掙扎。

+0

代碼不可能「沒有任何錯誤地工作」。您必須未能檢查'send()'函數上的錯誤。很顯然,這不是真正的代碼,或者你沒有報告所有的症狀。 – EJP

+0

@EJP我沒有得到編譯器警告也沒有問題。我忘了指定正確的套接字。該程序正常工作,我是如何告訴它的。不是我想要的。如果您認爲我應該修改最終答案,請提交編輯請求,我會很樂意接受它。 – RamonSS