Пожалуйста, помогите! Это связано в течение нескольких часов, и у меня не было никакой удачи ж/интернет-поискаОшибка сегментации клиента 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);
}
char * buf_addr не используется при вызове recvfrom(). –
Посмотрите очень внимательно на ВСЕХ «строковых» вызовов в сетевом коде. C не имеет строк, он имеет массивы символов, которые должны быть nul прекращены. –
Ох - пропустил «срочную» просьбу, выделенную жирным шрифтом - иметь нижний план. –