Сервер UDP C не получает пакеты - PullRequest
0 голосов
/ 18 марта 2011

Я знаю, что на соответствующие вопросы уже дан ответ, но мне не удалось решить мою проблему.

У меня есть простое приложение клиент-сервер UDP. И клиент, и сервер выглядят нормально, однако сервер не получает пакеты от клиента, он просто бесконечно получает сетевой идентификатор 192 (или, возможно, клиент не отправляет пакеты правильно).

Я не могу понять проблему, адрес и порт в порядке, у меня нет брандмауэра, и я даже добавил исключение для порта, просто чтобы быть уверенным. Если я запускаю сервер, я вижу, что он слушает нормально, на правом порту (netstat -a -s -p udp). Не могли бы вы дать мне подсказку, что случилось?

Вот мой код сервера:

/*.. includes */
#define PORT 8888
#define NPACK 10
#define MAXLEN 100

void signalError(char* s){
    perror(s);    
    exit(1);
}

int main()
{
struct sockaddr_in struct_srv, struct_client;
int s,i,cod, numbytes;
size_t clientSize;
int32_t nr;
int32_t sir1[MAXLEN], sir2[MAXLEN], sirComune[MAXLEN], nrEl1, nrEl2, nrComune;

//Creating the socket:
s = socket(PF_INET, SOCK_DGRAM, 0);
if(s==-1) signalError("Error while creating socket!");

memset(&struct_srv, 0, sizeof(struct_srv));
struct_srv.sin_family = AF_INET;
struct_srv.sin_addr.s_addr = htonl(INADDR_ANY);
struct_srv.sin_port = htons(PORT);  

s = bind(s, (struct sockaddr*) &struct_srv, sizeof(struct_srv));
if(s==-1) signalError("Bind error. Port is already in use!");

//receive packets:    
nrEl1 = -1;

char buf[MAXLEN];
printf("Accepting packets:\n");
//for(i=0;i<NPACK;i++) {
for(;;) {
     //Receive packets from client:
    clientSize = sizeof(struct_client);        
    numbytes = recvfrom(s, buf, MAXLEN - 1, 0,
                (struct sockaddr*) &struct_client, &clientSize);
    buf[numbytes] = '\0';

    printf("Packet is %d long.\n", numbytes);
    printf("Packet contains %s:\n", buf);       
    sleep(3);
}

close(s);
return 0;
}

И мой код клиента:

/* includes */
#define SRV_IP "127.0.0.1"
#define NPACK 100
#define MAXLEN 100
#define PORT 8888

void signalError(char* s){
    perror(s);
    exit(1);
}

int main(void)
{
struct sockaddr_in struct_client;
int s, i, result, size_client = sizeof(struct_client);
int32_t nr, sir1[MAXLEN], sir2[MAXLEN];

s = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
if(s==-1) signalError("Erorr creating socket!");

memset((char*) &struct_client, 0, sizeof(struct_client));
struct_client.sin_family = AF_INET;
struct_client.sin_addr.s_addr = htonl(INADDR_ANY);
struct_client.sin_port = htons(PORT);
if(inet_aton(SRV_IP, &struct_client.sin_addr)==0) {
    fprintf(stderr, "inet_aton() failed\n");
    exit(1);
}

char buf[MAXLEN];
int len;
for(i=0;i<NPACK;i++) {    
    printf("Give packet %d:\n", i+1);       
    fgets(buf, sizeof(buf), stdin);
    buf[strlen(buf)-1] = '\0';
    printf("I've read %s\n", buf);
    printf("Sending packet %d\n", i+1);
    result = sendto(s, buf, sizeof(buf)+1, 0,
            (struct sockaddr*) &struct_client, size_client);
    if(result==-1) signalError("Error sending packets!");        
}

close(s);
return 0;
}

Ответы [ 3 ]

1 голос
/ 18 марта 2011

Если я не пропустил что-то радикальное, вы просто отправляете сюда мусор.

nr никогда не инициализируется отправителем, кроме как в комментарии.buf инициализируется, но нигде не используется.

Можете ли вы попробовать изменить часть sendto на что-то вроде:

result = sendto(s, buf, strlen(buf)+1, 0,
        (struct sockaddr*) &struct_client, size_client);
1 голос
/ 18 марта 2011

Вот несколько незначительных моментов:

  1. На вашем сервере установите size_client = sizeof(struct_client) перед каждым вызовом recvfrom. Это и входной, и выходной параметр, поэтому необходимо убедиться, что вывод одного вызова не мешает вводу следующего.
  2. Убедитесь, что для последнего байта buf установлено значение '\0', чтобы printf не мог читать из памяти за границу.
  3. Что такое cod? Откуда это? Я думаю, что вы хотели проверить numbytes.
  4. Установка buf[strlen(buf) - 1] = '\0' обрезает последний символ буфера; это то, что вы пытались сделать?

И главная причина, по которой это не работает:

Вы никогда не инициализировали nr, поэтому невозможно сказать, что посылает sendto. Это, конечно, не отправляет buf, что, я думаю, было тем, что вы хотели ... Вы, вероятно, хотите это:

sendto(s, buf, sizeof(buf), ...)
0 голосов
/ 18 марта 2011

В вашем клиентском коде переменная nr, отправляемая по сети, не инициализируется и может указывать на что угодно. Вы, вероятно, хотите вместо этого отправить массив buf.

...