URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 7290
[ Назад ]

Исходное сообщение
"Проблема :("

Отправлено susanin , 03-Апр-08 22:43 
Доброго времени суток, вот есть два небольших куска кода.. Один отправляет пакет, другой принимает. ПРи передаче и приеме ошибок нет, но при попытке вывести содержимое принятого пакета на экран выводится всякая хрень. Помогите пожалуйста исправить ошибки, если они есть.
Вот код отправляющий пакет
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/udp.h>
struct udp_header
{
u_short src_port;
u_short dst_port;
u_short length;
u_short crc;
};

int main(int argc, char *argv[])
{
char buffer[50];
struct udp_header *udph = (struct udp_header*)buffer;
char *message = (char *)buffer + sizeof(struct udp_header);
int s;
int result;
struct sockaddr_in target;

udph->src_port = htons(23);
udph->dst_port = htons(23);
udph->length = 0;
udph->crc = 0;
s = socket(PF_INET, SOCK_RAW, IPPROTO_IP);
if (s < 0) printf("socket failed!\n");
memset(&target, 0, sizeof(target));
target.sin_family = AF_INET;
target.sin_addr.s_addr = inet_addr("192.168.0.11");
strcpy(outm.message, "Hello!");
result = sendto(s, &buffer, sizeof(buffer), 0, (struct sockaddr *)&target, sizeof(target));
if (result < 0) {printf("send failed!\n");}
else printf("Sended %d bytes\n",result);
return result;
}

А вот код, принимающий пакет:
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/udp.h>
struct udp_header
{
u_short src_port;
u_short dst_port;
u_short length;
u_short crc;
};

int main(int argc, char* argv[])
{
int s;
char buffer[50];
struct udp_header *udph = (struct udp_header*)buffer;
char *message = (char *) buffer + sizeof(struct udp_header);
int result;
struct sockaddr_in sourse;
int sourse_len;
memset(&sourse, 0, sizeof(sourse));
sourse.sin_family = AF_INET;
sourse.sin_addr.s_addr = inet_addr(/*argv[1]*/"192.168.0.11");
sourse_len = sizeof(sourse);
s = socket(PF_INET, SOCK_RAW, IPPROTO_IP);
while (1)
{
result = recvfrom(s, &buffer, sizeof(buffer), 0, (struct sockaddr*)&sourse, &sourse_len);
if (result > 0)
  {
   printf("Received %d bytes\n",result);
   printf("%s\n",message);
  }
}
}


Содержание

Сообщения в этом обсуждении
"Проблема :("
Отправлено domas , 05-Апр-08 18:25 
Представаленный код совершенно не работоспособен.

Первое чо бросается в глаза - тип сокета SOCK_RAW, а достаточной инициализации не вижу.

Второе - sendto() отправляет не инициализированный масив buffer, а принимающая сторона выводит не buffer, в который приняла, а message в котором какая-то порнография записана.

Идея программы, как я понял(чудом), вывести сообщение + заголовки udp. Но такая чушь написанна...

Итого: не хочу показаться грубым, но для начала RTFM по C!