Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лабы / 1 / !lab2 / UDPClient / UDPClient

.cpp
Скачиваний:
14
Добавлен:
17.04.2013
Размер:
3.72 Кб
Скачать
#include "stdafx.h"
#include "UDPClient.h"
#include "winsock2.h"
#include <conio.h>
#include "crc.h"
#include <iostream.h>

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

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

CWinApp theApp;

//double Ver = 0.3;

struct recv_info {
	SOCKET s;
	char FAR* buf; 
	int len;
	int flags;
	struct sockaddr FAR* from;
	int FAR* fromlen;
};

DWORD WINAPI myrecv(LPVOID info)
{
	int nrecvd = recvfrom(((recv_info*)info)->s,((recv_info*)info)->buf,((recv_info*)info)->len,
		((recv_info*)info)->flags,((recv_info*)info)->from,((recv_info*)info)->fromlen);
	if (nrecvd == -1) return 0xFFFFFFFF;
	return nrecvd;
}

int TMWaitRecvfrom (SOCKET s, char FAR* buf, int len, int flags, 
	struct sockaddr FAR* from, int FAR* fromlen,DWORD time_wait)
{
	recv_info info;
	info.buf = buf;
	info.s = s;
	info.flags = flags;
	info.from = from;
	info.fromlen = fromlen;
	info.len = len;
	DWORD thID;
	HANDLE hThread = CreateThread(NULL,0,myrecv,&info,NULL,&thID);
	if (WaitForSingleObject(hThread,time_wait) != WAIT_OBJECT_0) {
		TerminateThread(hThread,0xFFFFFFFF);	
		CloseHandle(hThread);
		return -5;
	}
	DWORD ecode;
	GetExitCodeThread(hThread,&ecode);
	CloseHandle(hThread);
    return ecode;
}
DWORD CrcTable[256];

struct packet
{
	u_short reclen;
	u_short ind;
	DWORD CRC;
	char buffer[1000];
} ;

struct ackwnpckt
{
	u_short ind;
};


int mysnd(SOCKET s,packet* a,int ind, sockaddr_in* client_addr)
{
	a->CRC = CalcCRC(&a->buffer[0],1000,&CrcTable[0]);
	
	ackwnpckt ack;

	int k=0;
	bool wasconf = false;
	
	sockaddr_in addr;
	int sz = sizeof(addr);

	addr.sin_family=AF_INET;
	addr.sin_port=htons(5150);
	addr.sin_addr.s_addr=client_addr->sin_addr.s_addr;

	while(1) {
		//int rnd = rand()%1000;
		//if (!(rnd<Ver*1000))
		sendto(s,(char*)a,sizeof(packet),0,(sockaddr*)client_addr,sizeof(*client_addr));
		int nrecv = TMWaitRecvfrom(s,(char*)&ack,sizeof(ackwnpckt),0,(sockaddr*)&addr,&sz,10000);
		if (nrecv == -1)
			return -1;
		//if (nrecv == -5) {
		//	continue;		
		//	k++;
		//}
		if (ack.ind==a->ind) {
			wasconf=true;
			break;
		}
	}		
//	if (!wasconf)
//		return -1;
	return 1;
}


int _tmain()
{
	WSADATA wsaData;
	SOCKET s;
	struct sockaddr_in local;
	int rc;
	CFile File;
	CString sWorkDir;
	CString sFileName;
	BYTE buffer[1000];
	DWORD dwRead=1;
    packet a;
	int number=1;
	
	FillCRCTable(&CrcTable[0]);

	srand((unsigned)time(NULL));

	if (WSAStartup(MAKEWORD(2,2), &wsaData) != 0)
    {
        printf("Failed to load Winsock!\n");
        return 1;
    }

	local.sin_family=AF_INET;
	local.sin_port=htons(5150);
	local.sin_addr.s_addr=inet_addr("127.0.0.1");

    s=socket(AF_INET,SOCK_DGRAM,0);
	if (s == SOCKET_ERROR)
    {
        printf("socket() failed: %d\n", WSAGetLastError());
        return 1;
    }

	cout<<"Enter work directory:";
	cin>>sWorkDir.GetBuffer(1024);

   	while (SetCurrentDirectory((LPCTSTR)sWorkDir) == 0)
	{
		cout<<"Invalid directory"<<endl;
		return -1;	
	}

	cout<<"Enter file name:";
	cin>>sFileName.GetBuffer(1024);

    if(!File.Open((LPCTSTR)sFileName,CFile::modeRead) )
    {
        cout<< "File could not be opened "  << "\n";
    }
	else cout<<"File open"<<endl;
	cout<<"... Please wait ..."<<endl;
     do
	 {
        dwRead = File.Read(a.buffer, 1000);
        a.reclen=dwRead;
	    a.ind=number; 	
	    rc=mysnd(s,&a,number,&local);
	    if (rc==-1) {cout<<"Connection closed"<<endl;}
	    number++;
     }  
	 while(dwRead!=0);
	 a.ind = 0;
	 rc=mysnd(s,&a,number,&local);
	 
	 File.Close();
	 return 0;
}


Соседние файлы в папке UDPClient