2014-09-29 2 views
-2

Пожалуйста, помогите! Это связано в течение нескольких часов, и у меня не было никакой удачи ж/интернет-поискаОшибка сегментации клиента UDP

КОД:

/* Описание: клиент должен сначала послать дейтаграмму к LocationServer. LocationServer будет прослушивать номер порта 23510 хоста c-lnx001.engr.uiowa.edu. Сообщение, содержащееся в этой дейтаграмме, должно быть указанным UserID (без нулевых символов, пробелов, строк или других посторонних символов). LocationServer будет реагировать с дейтаграммы, содержащей следующую информацию: [WeatherServer имя хоста] [WeatherServer порт #] */

#include <sys/types.h> 
#include <sys/socket.h> 
#include <stdio.h> /* for fprintf */ 
#include <string.h> /* for memcpy */ 
#include <strings.h> 
#include <netinet/in.h> 
#include <netdb.h> 
#include <stdlib.h> 

#define SIZE 2048 

INT Основной() {

struct hostent *hp;  /* host information */ 
struct sockaddr_in servaddr; /* server address */ 
char *my_message = "laura\0";/*USERID as message to server*/ 
char *buf_addr; 
char *host = "c-lnx001.engr.uiowa.edu\0"; 
int port = 23510; 
int fd; 

/* fill in the server's address and data */ 
//memset((char*)&servaddr, 0, sizeof(servaddr)); ? 
servaddr.sin_family = AF_INET; 
servaddr.sin_port = htons(23510); 

/* look up the address of the server given its name */ 
hp = gethostbyname("c-lnx001.engr.uiowa.edu"); 
if (!hp) { 
    fprintf(stderr, "could not obtain address of %s\n", host); 
    return 0; 
} 



/* put the host's address into the server address structure */ 
// DOESN't WORK: memcpy((void *)&servaddr.sin_addr, hp->h_addr_list[0], hp->h_length); 

bcopy(hp->h_addr,(char*)&servaddr.sin_addr,hp->h_length); 

if((fd = socket(AF_INET,SOCK_DGRAM, 0))<0) 
{ 
    exit(2); 

} 

/* send a message to the server */ 
if (sendto(fd, my_message, strlen(my_message), 0, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) 
{ 
    perror("sendto failed"); 
    return 0; 
} 
int addrlen = sizeof(servaddr); 

recvfrom(fd,buf_addr,SIZE,0,(struct sockaddr*)&servaddr,&addrlen); 
printf("%s\n", buf_addr); 

}

+0

char * buf_addr не используется при вызове recvfrom(). –

+0

Посмотрите очень внимательно на ВСЕХ «строковых» вызовов в сетевом коде. C не имеет строк, он имеет массивы символов, которые должны быть nul прекращены. –

+0

Ох - пропустил «срочную» просьбу, выделенную жирным шрифтом - иметь нижний план. –

ответ

0

Я думаю, ваша проблема в том, что вы не сбросили serveraddr
Вот рабочая копия

#include <netinet/in.h> 
#include <arpa/inet.h> 
#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
#define IP_ADDRESS "127.0.0.1" 
#define SERVER_PORT 5060 

int main (int argc, char *argv[]) 
{ 
    int recBytes, clientSocket=socket(AF_INET, SOCK_DGRAM, 0); 
    char buf[80], msg[]="greeting to server"; 
    const int msgLen = sizeof(msg); 
    struct sockaddr_in serverAddr; 
    socklen_t reSize; 

    memset(&serverAddr, sizeof(struct sockaddr_in), 0); 

    serverAddr.sin_family = AF_INET; 
    serverAddr.sin_port = htons(SERVER_PORT); 
    inet_aton(IP_ADDRESS, &serverAddr.sin_addr); 

    if(sendto(clientSocket, msg, sizeof(msg), 0, (struct sockaddr*)&serverAddr, sizeof(serverAddr)) != (sizeof(msg))) 
    { 
     perror("sendto"); 
     return -1; 
    } 

    reSize = sizeof(struct sockaddr); 
    if((recBytes = recvfrom(clientSocket, buf, sizeof(buf)-1, 0, (struct sockaddr*)&serverAddr, &reSize)) == -1) 
    { 
     perror("recvfrom"); 
     return -1; 
    } 
    buf[recBytes]='\0'; 
    printf("%s\n", buf); 

    return 0; 
} 
+0

printf в сетевом коде неправильно используется почти как strlen(). Протокол, описанный OP, не определяет завершающий нуль, а автоматический буфер char buf [80] не инициализируется нулями, а «recbytes», возвращаемый вызовом recvfrom(), не используется для добавления завершающего нуля. Возможно, что buf не может содержать добавленный нуль в любом случае, если датаграмма из 80 байт получена. –

+0

Право, обновленный. – atlanteh

Смежные вопросы