2013-08-28 2 views
4

Я совершенно новичок в программировании в UNIX и написал следующий код для программирования клиентов и серверов. Когда я пытаюсь запустить клиентский код, он говорит «Соединение отказано». Может кто-нибудь, пожалуйста, скажите мне, что может быть причиной этого.Программирование сокетов в C (пример сервера клиентов)

код сервера:

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

int main(void) 
{ 
    int sockid,newsockid; 
    socklen_t addr_size; 
    char *msg="What a beautiful morning!"; 
    int len, bytes_sent; 
    sockid=socket(AF_INET,SOCK_STREAM,0); 
    if(sockid==-1) 
    { 
     perror("socket"); 
     exit(1); 
    } 
    else 
     printf("created"); 
    struct sockaddr_in serveraddr,clientaddr; 
    bzero((char *)&serveraddr,sizeof(serveraddr)); 
    serveraddr.sin_family=AF_INET; 
    serveraddr.sin_port=htons(7400); 
    serveraddr.sin_addr.s_addr=INADDR_ANY; 

    if(bind(sockid,(struct sockaddr *)&serveraddr,sizeof(serveraddr))<0) 
    { 
     perror("bind"); 
     return -1; 
    } 

    listen(sockid,5); 
    addr_size=sizeof(clientaddr); 
    newsockid=accept(sockid,(struct sockaddr *)&clientaddr,&addr_size); 
    len = strlen(msg); 
    bytes_sent = send(sockid, msg, len, 0); 
    close(sockid); 
} 

Client Код:

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

int main(void) 
{ 
    int byte_count; 
    struct sockaddr_in serveraddr; 
    char *servername; 
    char buf[256]; 
    socklen_t addr_size; 
    int sockfd; 

    sockfd=socket(AF_INET,SOCK_STREAM,0); 
    bzero(&serveraddr,sizeof(serveraddr)); 
    serveraddr.sin_family=AF_INET; 
    serveraddr.sin_port=htons(11378); 
    servername=gethostbyname("localhost"); 
    inet_pton(AF_INET,servername,&serveraddr.sin_addr); 

    addr_size=sizeof(serveraddr); 
    if(connect(sockfd,(struct sockaddr *)&serveraddr,addr_size)==-1) 
    { 
     perror("connect"); 
     exit(1); 
    } 

    byte_count = recv(sockfd, buf, sizeof buf, 0); 
    printf("recv()'d %d bytes of data in buf\n", byte_count); 

    close(sockfd); 
} 

Ранним помощь будет оценена. Спасибо.

+0

«Соединение отказано» означает «* нет такого номера телефона, номер, который вы набрали, неизвестен *» с точки зрения ip-адреса и/или номера порта. – alk

+1

Двойная проверка, как инициализируется 'servername'. И: ** Сделайте ** скомпилируйте ** все предупреждения на ** ('-Wall -Wextra -pedantic' для gc), затем ** исправить ** код **, пока не появится больше предупреждений ** всплывает! – alk

+0

Я сделал несколько изменений .. пренебрегаю изменениями порта нет. Есть ли что-нибудь еще, что мне нужно сделать? – user2725511

ответ

3
sockfd=socket(AF_INET,SOCK_STREAM,0); 
bzero(&serveraddr,sizeof(serveraddr)); 
serveraddr.sin_family=AF_INET; 
serveraddr.sin_port=htons(7400); 
inet_pton(AF_INET,servername,&serveraddr.sin_addr); // here 

Вы проходя servername к inet_pton() но не инициализирована! Таким образом, inet_pton() не удастся. Вы должны проверить его возвращаемое значение.

servername=gethostbyname(); //here 
addr_size=sizeof(serveraddr); 

Вторая проблема заключается в том, что вы не используете gethostbyname() correctly.Take взглянуть на manpage, вы увидите, что gethostbyname() берется аргументы и возвращает указатель на struct hostent, а не указатель на char как ты сделал. Ваш компилятор не предупреждает вас об этом, потому что вы не включаете netdb.h.

Вы должны проверить возвращаемые значения всех функций, которые вы используете, избежать таких проблем. Вы должны включить некоторые флаги вашего компилятора (например, alk в комментариях к вопросу, -W -Wextra -Wall -pedantic действительно отличные флаги).

+0

Я исправил обе ошибки, которые вы мне просили. Это все еще не работает.Еще раз он показывает, что «Соединение отказано». – user2725511

+0

Пожалуйста, обновите код в своем вопросе так :) – nouney

+1

Хорошо. Обновленный код такой .. sockfd = socket (AF_INET, SOCK_STREAM, 0); bzero (& serveraddr, sizeof (serveraddr)); serveraddr.sin_family = AF_INET; serveraddr.sin_port = htons (11378); servername = gethostbyname ("localhost"); inet_pton (AF_INET, имя сервера, & serveraddr.sin_addr); – user2725511

0

Ну, вы должны быть уверены, что ваш сервер работает и прослушивает соответствующий порт (7400). Просто проверьте: «netstat -tanp», если что-то прослушивает порт 7400, а затем попытайтесь подключиться.

+1

Хотя этот шаг является одним из общих шагов отладки, выполняемых при обнаружении проблемы подключения, в этом случае проблема возникает на стороне клиента, в соответствии с источниками OP. – alk

+0

@alk Более того, сервер * не работает * на порту 11378. Является ли это ошибкой клиента или сервера, является спорным. – EJP

3

проверить порт. серверный порт - 7400, но клиент пытается подключиться к номеру порта 11378, поэтому было отказано только в соединении.

1

Обязательно укажите errno.h в своей программе.
Добавить строку printf("%s", strerr(errno)); в вашу программу после любого сбоя. Любой отказ системного вызова устанавливает правильное значение errno, что упрощает диагностику проблемы.