Добавил:
korayakov
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:
#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