2017-01-11 6 views
0

Я действительно не знаю, что я сделал не так. Я включил все хорошие библиотеки. И протестировал его на моей VPS и локальной установке Ubuntu. Также я искал другой код для той же программы, которая работает. Но я продолжаю получать сообщение «ОШИБКА: невозможно связать интернет-адрес с сокетом». Вот мой TCP сервер в коде C:Программирование C: получение ошибки при привязке адреса и порта к сокету

#include <stdio.h> 
#include <strings.h> 
#include <sys/types.h> 
#include <sys/socket.h> 
#include <unistd.h> 
#include <netinet/in.h> 
#include <stdlib.h> 

//Enter The Port and the Ip Address here. 

#define PORT 666 
#define ADRESS 0 

//Enter the amount of Maximum Poeple entering the server. 
#define NUMBER_OF_CONNECTIONS 8 

int main(){ 
    int sockfd, newsockfd, portno = 666, clilen; 
    char message[1024]; 
    struct sockaddr_in serv_addr, cli_addr; 
    int n; 

    sockfd = (AF_INET, SOCK_STREAM, 0); 

    if (sockfd < 0){ 
     printf("ERROR: could not create server-socket.\n"); 
     exit(1); 
    } 

    bzero((char *) &serv_addr, sizeof(serv_addr)); 

    // Declaring the port. 
    //portno = 666; 
    // Declaring the type of connection. (internet connection) 
    serv_addr.sin_family = AF_INET; 
    // Declaring the IP. 
    serv_addr.sin_addr.s_addr = INADDR_ANY; 
    // Declaring the Port. 
    serv_addr.sin_port = htons(portno); 

    // Binding the Socket? 
    if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0){ 
     printf("ERROR: could not bind internet address to the socket method.\n"); 
     exit(1); 
    } 

    // Entering "Listen Mode". 
    listen(sockfd, NUMBER_OF_CONNECTIONS); 
    clilen = sizeof(cli_addr); 

    // Creating a New Socket for the client. 
    newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen); 

    if (newsockfd < 0){ 
     printf("ERROR: could not accept connection.\n"); 
     exit(1); 
    } 

    //Clearing the message-buffer. 
    bzero(message,1024); 

    // Reading the message. 
    n = read(newsockfd,message,1023); 

    if (n < 0){ 
     printf("ERROR: could not read message.\n"); 
    } 

    printf("Message: %s\n",message); 

    n = write(newsockfd, "I got your message.", 18); 

    if (n < 0) 
    { 
     printf("ERROR: sending to client.\n"); 
    } 
    return 0; 
} 
+0

Проверьте 'errno', если' bind() 'failed. – jxh

+0

Используйте 'perror' вместо' printf' при проверке ошибок. Это выведет строку ошибки для последней неудавшейся команды. – dbush

+2

Что-то не хватает в этой строке 'sockfd = (AF_INET, SOCK_STREAM, 0);' –

ответ

4

Проблема эта линия:

sockfd = (AF_INET, SOCK_STREAM, 0); 

Он действителен, и выражение справа имеет значение 0 (см. Запятую в C).

Теперь звонок в bind() размещен на fd 0, который обычно является (псевдо) терминалом. Это не удастся.

Решение:

sockfd = socket(AF_INET, SOCK_STREAM, 0); 
+0

Нет, это не сработало. – tr0ubl3

+0

@ tr0ubl3 Вы запускаете программу с правами root? В противном случае вам нужно будет выбрать номер порта выше 1024 для успеха. – Ctx

3

Попробуйте заменить:

sockfd = (AF_INET, SOCK_STREAM, 0);

с

sockfd = socket(AF_INET, SOCK_STREAM, 0);

0

Это помогло мне:

Ofcourse изменения sockfd = (AF_INET, SOCK_STREAM, 0); к sockfd = socket(AF_INET, SOCK_STREAM, 0); и по какой-то причине я должен был использовать корневые привилегии для port under 1024.

Может кто-нибудь может объяснить, почему?

Благодарим за помощь: D