Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.03.2010, 13:08   #1
DRagono
 
Аватар для DRagono
 
Регистрация: 17.03.2010
Сообщений: 6
По умолчанию Отправка файла по UDP (winsock2)

Изучаю сетевое программирование в свободное на работе время и разбираю на простейших примерах. Возникла такая проблема при отправке файла по UDP: recvfrom в server не принимает посылаемые данные от sendto в клиенте. Второй день уже бьюсь головой о стол.

Server
Код:
#include "winsock2.h"
#include "sys/types.h"
#include <iostream>
#include <fstream>
#include <memory.h>
#include <string.h>

#pragma comment(lib,"Ws2_32.lib")

using namespace std;

#define N 1024

void main() {
	struct sockaddr_in saddr, caddr;
	SOCKET s;

	char buff[N];
	long int totalsize_, size_, offset_;
	ofstream out;
	int addrlen;

	WSADATA WsaData;
	if( WSAStartup(MAKEWORD(2, 2), &WsaData) )
	{
		printf("Winsock cannot be started\r\n");
	}

	cout<<"WsaData Intialized\n";

	ZeroMemory (&saddr, sizeof (saddr));
	saddr.sin_family=AF_INET;
	saddr.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
	saddr.sin_port = htons(7124);

	s = socket(AF_INET, SOCK_DGRAM, 0);
	cout<<"Socket Created\n";
	int l = bind (s, (sockaddr *) &saddr, sizeof (saddr));
	cout<<"Socket Binded. Code: " << l <<"\n";

	out.open("tmpout", ios::out | ios::binary);
	cout<<"File opened\n";
	int k=1;

	while(1) {
		if (k==1) cout << "Cycled started\n";
		size_ = recvfrom (s, buff, sizeof(buff), 0, (sockaddr *) &caddr, &addrlen);
		cout<< k <<" part received. Size is"<< size_ <<"\n";
			if (!strcmp(buff, "-=END OF FILE=-")) {
				cout << "Cycle ended\n";
				break;
			}
			if (size_ != -1) out.write(buff,size_);
		k++;
	}
	out.close();
}
Client
Код:
#include "winsock2.h"
#include "sys/types.h"
#include <iostream>
#include <fstream>
#include <sstream>
#include <memory.h>
#include <string.h>

#pragma comment(lib,"Ws2_32.lib")

using namespace std;

#define N 1024

void main() {
	struct sockaddr_in saddr, caddr;
	SOCKET s;

	char buff[N];
	long int totalsize_, size_, offset_;
	int addrlen_;
	ifstream in;

	WSADATA WsaData;
	if( WSAStartup(MAKEWORD(2, 2), &WsaData) )
	{
		printf("Winsock cannot be started\r\n");
	}
	cout << "WsaData Initialized\n";

	ZeroMemory (&saddr, sizeof (saddr));
	saddr.sin_family=AF_INET;
	saddr.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
	saddr.sin_port = htons(7124);

	s = socket(AF_INET, SOCK_DGRAM, 0);
	cout << "Socket created\n";


	in.open("tmp", ios::in | ios::binary);
	cout << "File opened\n";

	in.seekg(0, ios::end);
	totalsize_=in.tellg();
	cout << "File size is " << totalsize_ <<"\n";
	in.seekg(0, ios::beg);

	int k=1;
	while (!in.eof()) {
		if (k==1) cout << "Cycle started\n";
		offset_ = in.tellg();
		in.read(buff, N);
		if (totalsize_ - offset_ < N) size_ = totalsize_ - offset_;
		else size_ = N;
		if (size_)
		{
			sendto(s, buff, size_, 0, (sockaddr *) &saddr, sizeof (saddr));
//			cout << k << " part sended\n";
		}
		k++;
	}
	cout << "Cycle ended\n";

	in.close();

	char* endbuff;
	endbuff="-=END OF FILE=-";
	sendto(s, endbuff, strlen(endbuff), 0, (sockaddr *) &saddr, sizeof (saddr));
	cout << "Transfer ended\n";
}
Заранее благодарен за любую помощь.
DRagono вне форума Ответить с цитированием
Старый 18.03.2010, 01:00   #2
DRagono
 
Аватар для DRagono
 
Регистрация: 17.03.2010
Сообщений: 6
По умолчанию

up message. желающих помочь нет?
DRagono вне форума Ответить с цитированием
Старый 18.03.2010, 01:28   #3
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

В код не смотрел, но скажу лишь, что UDP не лучший выбор для передачи файлов, так как этот протокол не гарантирует доставку пакетов, и как результат файл может прийти битый(не полностью). Для оных целей лучше юзать TCP
netrino вне форума Ответить с цитированием
Старый 18.03.2010, 09:27   #4
DRagono
 
Аватар для DRagono
 
Регистрация: 17.03.2010
Сообщений: 6
По умолчанию

Да эт всё понятно. Просто разбираю оба протокола. По TCP получилось, а по UDP косяк. Не пойму как действует recvfrom: либо его надо нон стопом циклить, либо он должен доходить до recvfrom и ждать sendto от клиента и, только после получения блока данных, переходить к следующей строчке кода. Но вроде как коду в моём случае должно быть пофиг на принцип работы recvfrom... Короч, не пойму в чём косяк. :\ Наверняка фигня какая-нить, которой я не замечаю.

Последний раз редактировалось DRagono; 18.03.2010 в 09:30.
DRagono вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Отправка файла на файлообменник W0LF Работа с сетью в Delphi 18 17.01.2010 16:12
отправка файла на почту CraZZy RabbIt Общие вопросы Delphi 9 21.04.2009 18:59
отправка файла по почте DeDoK Работа с сетью в Delphi 1 10.11.2008 10:13
Отправка файла на сервер kirill555 PHP 8 21.12.2007 12:51