Yazılan kod yorum satırıyla size
anlatılmaya çalışılacaktır.Daha öncede bahsetdildiği gibi kodu C++ dilinde
yazılmıştır.Kodumuz üç sınıftan oluşmaktadır.Üç sınıftan oluşmaktadır. İlk
sınıfımız Receiver sınıfımız dır. Bu sınıfta veriler sendto fonksiyonu ile
yollanmıştır.İkinci sınıfımız ise Server sınıfıdır.Bu sınıfta veriler hem
alınmakta hem de gönderilmektedir. Sendto fonksiyonu ile gönderilip Recvfrom fonksiyonu
ile veriler alınmaktadır.En son olarak Sender sınıfımız bulunmaktadır ,bu
sınıfta ise veriler alınmaktadır.
Bu sınıfta veriler alındığı için burada kaç milisaniye de geldiğinin hesabı yapmaktayız. Soket programlama UDP protokolü ile yazılmıştır.Server sınıfı verinin alındığı sınıftır. Client ise verinin iletildiği bölgedir.
Bu sınıfta veriler alındığı için burada kaç milisaniye de geldiğinin hesabı yapmaktayız. Soket programlama UDP protokolü ile yazılmıştır.Server sınıfı verinin alındığı sınıftır. Client ise verinin iletildiği bölgedir.
Konuyu daha iyi anlamak için bir önceki soket programlama yazımıza gidiniz...
1.Senderdır(Server)
Bu kısımda veriler sendto
fonksiyonuyla yollanmaktadır.
2.
Serverdır(Client)
Bu
kısımda veriler hem alınmakta hem de gönderilmektedir.Recvfrom ve Sendto fonksiyonları kullanılmaktadır.
3.Recevier(Client)
Bu kısımda ise
Serverdan gelen bilgiler alınmaktadır.Burada verinin kaç saniyede
geldiği ve kaç eksik paket bulunduğu yazılmıştır.
Program cmd de
şu şekilde açılmaktadır.Üç adet cmd açılacaktır.
Desktop\NetSendReceive\Debug\Receiver.exe
2000 0
Desktop\NetSendReceive\Debug\Server.exe
1000 127.0.0.1 2000
Desktop\NetSendReceive\Debug\Sender.exe
127.0.0.1 1000 0
Dosya uzantınız
neredeyse ona göre cmd' ye bildirmelisiniz .Ben kendi uzantı adresime göre
dosya uzantımı belirttim.
Receiver Sınıfı
// ReceivingClient.cpp : Defines the entry point for
the console application.
//
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include <winsock2.h>
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <Ws2tcpip.h>
#include <time.h>
#pragma comment(lib,"ws2_32.lib") //Winsock
Library
#define BUFLEN 8192
int main(int argc, char *argv[])
{
struct
sockaddr_in si_other;
int s;
int slen;
int iTotalBytes
= 0;
int iRecvBytes;
int
bFirstDataFlag = 0;
int const
buff_size = 8 * 1024 * 1024; // 8 MB ethernet buffer
int iResult;
int iloopcount
= 1;
int iLostPackets = 0;
int p = 0;
int PackNum =
1;
char
buf[BUFLEN];
u_long iMode =
0;
LARGE_INTEGER
EndingTime;
LARGE_INTEGER ElapsedMicroseconds;
LARGE_INTEGER
Frequency;
LONGLONG
StartTime;
WSADATA wsa;
if (argc != 2)
{
printf("Usage:
receiver <rcv port>\n");
_getch();
exit(1);
}
//Initialise
winsock
printf("Initialising
Winsock...\n");
if
(WSAStartup(MAKEWORD(2, 2), &wsa) != 0)
{
printf("Failed.
Error Code : %d\n", WSAGetLastError());
exit(EXIT_FAILURE);
}
printf("Initialised.\n");
//create socket
if ((s =
socket(AF_INET, SOCK_DGRAM, 0)) == SOCKET_ERROR)
{
printf("socket()
failed with error code : %d\n", WSAGetLastError());
exit(EXIT_FAILURE);
}
setsockopt(s,
SOL_SOCKET, SO_RCVBUF, (char *)(&buff_size), sizeof(buff_size));
iResult = ioctlsocket(s,
FIONBIO, &iMode);
if (iResult !=
NO_ERROR)
{
printf("ioctlsocket
failed with error: %ld\n", iResult);
}
//setup address
structure
memset((char
*)&si_other, 0, sizeof(si_other));
si_other.sin_family
= AF_INET;
si_other.sin_port
= htons(atoi(argv[1]));
si_other.sin_addr.S_un.S_addr
= htonl(INADDR_ANY);
//Bind Socket
if (bind(s,
(struct sockaddr *)&si_other, sizeof(si_other)) == SOCKET_ERROR)
{
printf("Bind
failed with error code : %d", WSAGetLastError());
exit(EXIT_FAILURE);
}
printf("Bind
done.\n");
slen =
sizeof(si_other);
memset(buf, 0,
BUFLEN);
QueryPerformanceFrequency(&Frequency);
while
(iloopcount > 0)
{
iRecvBytes =
recvfrom(s, buf, BUFLEN, 0, (struct sockaddr *) &si_other, &slen);
if (iRecvBytes
== SOCKET_ERROR)
{
if
(WSAGetLastError() == 10035)
{
continue;
}
printf("recvfrom()
failed with error code : %d", WSAGetLastError());
_getch();
exit(EXIT_FAILURE);
}
else
{
if
(bFirstDataFlag == 0)
{
iloopcount =
*((int *)buf);
StartTime =
*((LONGLONG*)(buf + sizeof(int)));
bFirstDataFlag
= 1;
}
// Use below
to verify each packet is received
PackNum =
*((int*)(buf + sizeof(int) + sizeof(LONGLONG)));
iloopcount--;
p++;
if (p != PackNum)
{
//printf("p: %d Packnum: %d\n", p, PackNum);
iLostPackets
+= (PackNum - p);
iloopcount
-= (PackNum - p);
p = PackNum;
}
//printf(".");
//printf("%d
%d %d %d\n", p, iloopcount, iRecvBytes, PackNum);
//printf("%d\n",
PackNum);
}
}
QueryPerformanceCounter(&EndingTime);
ElapsedMicroseconds.QuadPart
= EndingTime.QuadPart - StartTime;
ElapsedMicroseconds.QuadPart
*= 1000000;
ElapsedMicroseconds.QuadPart
/= Frequency.QuadPart;
printf("\nReceived %d bytes in %d
packets in %d milliseconds.", p * iRecvBytes, p,
ElapsedMicroseconds.QuadPart / 1000);
printf("\nLost packets: %d",
iLostPackets);
printf("\nSpeed:
%f Megabits per sec", (float)(8 * p * iRecvBytes) /
(float)ElapsedMicroseconds.QuadPart);
printf("\nPress
enter.\n");
_getch();
return 0;
}
Sender Sınıfı
// SendingClient.cpp : Defines the entry point for the
console application.
//
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include <winsock2.h>
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <Ws2tcpip.h>
#include <time.h>
#pragma comment(lib,"ws2_32.lib") //Winsock
Library
#define BUFLEN 5000
#define DATASIZE 1024
#define LOOPCOUNT 1024
void initBuffer(char **pBuf, int nSize, int loopcount)
{
char ch = 'x';
int datasize;
datasize = nSize;
nSize +=
(sizeof(int) + sizeof(LONGLONG) + 1 + sizeof(int));
*pBuf = (char
*)malloc(nSize);
memset(*pBuf,
0, nSize);
memset((*pBuf +
sizeof(int) + sizeof(LONGLONG) + sizeof(int)), ch, datasize);
*((int*)*pBuf)
= loopcount;
}
int main(int argc, char *argv[])
{
struct
sockaddr_in si_other;
int s;
int slen = sizeof(si_other);
int count;
int nSize = 10;
int loopcount;
int p;
int
bFirstDataFlag = 0;
char *pBuffer;
WSADATA wsa;
LARGE_INTEGER
StartTime;
LARGE_INTEGER
EndTime;
LARGE_INTEGER
Frequency;
LARGE_INTEGER ElapsedMicroseconds;
LONGLONG a;
if ((argc >=
3) && (argc <= 5))
{
for (count =
1; count < argc; count++)
{
printf("argv[%d]
= %s\n", count, argv[count]);
}
}
else
{
printf("Usage:
sender <sending ip> <send port> [data package size] [loop
count]\n");
_getch();
exit(1);
}
//Initialise
winsock
printf("Initialising
Winsock...\n");
if
(WSAStartup(MAKEWORD(2, 2), &wsa) != 0)
{
printf("Failed.
Error Code : %d\n", WSAGetLastError());
exit(EXIT_FAILURE);
}
printf("Initialised.\n");
//create socket
if ((s =
socket(AF_INET, SOCK_DGRAM, 0)) == SOCKET_ERROR)
{
printf("socket()
failed with error code : %d\n", WSAGetLastError());
exit(EXIT_FAILURE);
}
//setup address
structure
memset((char
*)&si_other, 0, sizeof(si_other));
si_other.sin_family
= AF_INET;
si_other.sin_port
= htons(atoi(argv[2]));
si_other.sin_addr.S_un.S_addr
= inet_addr(argv[1]);
if (argc >= 4)
{
nSize = atoi(argv[3]);
}
else
{
nSize = DATASIZE;
}
if (argc == 5)
{
loopcount = atoi(argv[4]);
}
else
{
loopcount = LOOPCOUNT;
}
initBuffer(&pBuffer,
nSize, loopcount);
slen = sizeof(si_other);
p = 1;
QueryPerformanceFrequency(&Frequency);
QueryPerformanceCounter(&StartTime);
//start
communication
while
(loopcount > 0)
{
if
(bFirstDataFlag == 0)
{
a =
StartTime.QuadPart;
memcpy((pBuffer
+ sizeof(int)), &a, sizeof(a));
bFirstDataFlag
= 1;
}
memcpy((pBuffer
+ sizeof(int) + sizeof(LONGLONG)), &p, sizeof(p));
//send the
message
if (sendto(s,
pBuffer, nSize, 0, (struct sockaddr *) &si_other, slen) == SOCKET_ERROR)
{
printf("sendto()
failed with error code : %d", WSAGetLastError());
_getch();
exit(EXIT_FAILURE);
}
else
{
p++;
loopcount--;
//printf(".");
}
}
QueryPerformanceCounter(&EndTime);
ElapsedMicroseconds.QuadPart
= EndTime.QuadPart - StartTime.QuadPart;
ElapsedMicroseconds.QuadPart
*= 1000000;
ElapsedMicroseconds.QuadPart
/= Frequency.QuadPart;
printf("\nSent %d bytes in %d
packets in %d milliseconds.", (p - 1) * nSize, p - 1,
ElapsedMicroseconds.QuadPart / 1000);
printf("\nPress
enter.\n");
_getch();
return 0;
}
Server Sınıfı
// server.cpp : Defines the entry point for the
console application.
//
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include <conio.h>
#include <stdio.h>
#include <winsock2.h>
#include <Ws2tcpip.h>
#include <time.h>
#pragma comment(lib,"ws2_32.lib") //Winsock
Library
#define BUFLEN 5000
int main(int argc, char *argv[])
{
int count;
int n;
if (argc >
3)
{
for (count =
1; count < argc; count++)
{
printf("argv[%d]
= %s\n", count, argv[count]);
}
}
else
{
printf("Usage:
server <rcv port> <sending ip> <send port 1> ... <send
port n>\n");
getchar();
exit(1);
}
int SockNum =
count - 3;
printf("SockNum
= %d\n", SockNum);
SOCKET s;
struct
sockaddr_in server, si_other;
struct
sockaddr_in si_other2[10];
int slen;
int recv_len;
char
buf[BUFLEN];
WSADATA wsa;
slen =
sizeof(struct sockaddr_in);
//Initialise
winsock
printf("Initialising
Winsock...\n");
if
(WSAStartup(MAKEWORD(2, 2), &wsa) != 0)
{
printf("Failed.
Error Code : %d", WSAGetLastError());
exit(EXIT_FAILURE);
}
printf("Initialised.\n");
//Create
ReceivingSocket
if ((s =
socket(AF_INET, SOCK_DGRAM, 0)) == INVALID_SOCKET)
{
printf("Could
not create ReceivingSocket : %d", WSAGetLastError());
}
printf("ReceivingSocket
created.\n");
//Configure
ReceivingSocket
server.sin_family
= AF_INET;
server.sin_addr.s_addr
= INADDR_ANY;
server.sin_port
= htons(atoi(argv[1]));
SOCKET
SocketArray[10];
for (n = 1; n
<= SockNum; n++)
{
//Create
SendingSockets
if
((SocketArray[n] = socket(AF_INET, SOCK_DGRAM, 0)) == INVALID_SOCKET)
{
printf("Could
not create SendingSocket : %d", WSAGetLastError());
}
printf("SendingSocket
%d created.\n", n);
//Configure
SendingSockets
si_other2[n].sin_family
= AF_INET;
si_other2[n].sin_addr.s_addr
= inet_addr(argv[2]);
si_other2[n].sin_port
= htons(atoi(argv[n + 2]));
}
//Bind
ReceivingSocket
if (bind(s,
(struct sockaddr *)&server, sizeof(server)) == SOCKET_ERROR)
{
printf("Bind
failed with error code : %d", WSAGetLastError());
_getch();
exit(EXIT_FAILURE);
}
printf("Bind
done.\n");
//clear the
buffer
memset(buf,
'\0', BUFLEN);
printf("Waiting
for data...\n");
//Listening
while (1)
{
// receive
data from SendingClient
if ((recv_len
= recvfrom(s, buf, BUFLEN, 0, (struct sockaddr *) &si_other, &slen)) ==
SOCKET_ERROR)
{
printf("recvfrom()
failed with error code : %d", WSAGetLastError());
break;//exit(EXIT_FAILURE);
}
else
{
//printf(".");
for (n = 1; n
<= SockNum; n++)
{
//send data
to ReceivingClient
if
(sendto(SocketArray[n], buf, recv_len, 0, (struct sockaddr*) &si_other2[n],
slen) == SOCKET_ERROR)
{
printf("sendto()
failed with error code : %d", WSAGetLastError());
}
}
}
}
return 0;
}
0 Yorumlar
Bizimle fikirlerinizi paylaşabilirsiniz.