Сервак:
Код:
#include <stdio.h>
#include <winsock2.h> // Wincosk2.h ДНКФЕМ АШРЭ
// ОНДЙКЧВЕМ ПЮМЭЬЕ windows.h!
#include <windows.h>
#define MY_PORT 1025
// оНПР, ЙНРНПШИ ЯКСЬЮЕР ЯЕПБЕП
// ОПНРНРХО ТСМЙЖХХ, НАЯКСФХБЮЧЫХИ
// ОНДЙКЧВХБЬХУЯЪ ОНКЭГНБЮРЕКЕИ
DWORD WINAPI ClientThread(LPVOID client_socket);
// ЦКНАЮКЭМЮЪ ОЕПЕЛЕММЮЪ ? ЙНКХВЕЯРБН
// ЮЙРХБМШУ ОНКЭГНБЮРЕКЕИ
int nclients = 0;
int main(int argc, char* argv[])
{
WSADATA wsaData;
printf("TCP SERVER DEMO\n");
// ьЮЦ 1 - хМХЖХЮКХГЮЖХЪ аХАКХНРЕЙХ яНЙЕРНБ
// р.Й. БНГБПЮЫЕММЮЪ ТСМЙЖХЕИ ХМТНПЛЮЖХЪ
// МЕ ХЯОНКЭГСЕРЯЪ ЕИ ОЕПЕДЮЕРЯЪ СЙЮГЮРЕКЭ МЮ
// ПЮАНВХИ АСТЕП, ОПЕНАПЮГСЕЛШИ
// Й СЙЮГЮРЕКЧ МЮ ЯРПСЙРСПС WSADATA.
// рЮЙНИ ОПХЕЛ ОНГБНКЪЕР ЯЩЙНМНЛХРЭ НДМС
// ОЕПЕЛЕММСЧ, НДМЮЙН, АСТЕП ДНКФЕМ АШРЭ МЕ ЛЕМЕЕ
// ОНКЙХКНАЮИРЮ ПЮГЛЕПНЛ (ЯРПСЙРСПЮ WSADATA
// ГЮМХЛЮЕР 400 АЮИР)
if (WSAStartup(0x0202,&wsaData))
{
// нЬХАЙЮ!
printf("Error WSAStartup %d\n",
WSAGetLastError());
return -1;
}
printf("WSAStartup() OK\n");
// ьЮЦ 2 - ЯНГДЮМХЕ ЯНЙЕРЮ
SOCKET mysocket;
// AF_INET - ЯНЙЕР хМРЕПМЕРЮ
// SOCK_STREAM - ОНРНЙНБШИ ЯНЙЕР (Я
// СЯРЮМНБЙНИ ЯНЕДХМЕМХЪ)
// 0 - ОН СЛНКВЮМХЧ БШАХПЮЕРЯЪ TCP ОПНРНЙНК
if ((mysocket=socket(AF_INET,SOCK_STREAM,0))<0)
{
// нЬХАЙЮ!
printf("Error socket %d\n",WSAGetLastError());
WSACleanup();
// дЕХМХЖХКХГЮЖХЪ АХАКХНРЕЙХ Winsock
return -1;
}
printf("socket() OK\n");
// ьЮЦ 3 ЯБЪГШБЮМХЕ ЯНЙЕРЮ Я КНЙЮКЭМШЛ ЮДПЕЯНЛ
sockaddr_in local_addr;
local_addr.sin_family=AF_INET;
local_addr.sin_port=htons(MY_PORT);
// МЕ ГЮАШБЮЕЛ Н ЯЕРЕБНЛ ОНПЪДЙЕ!!!
local_addr.sin_addr.s_addr=0;
// ЯЕПБЕП ОПХМХЛЮЕР ОНДЙКЧВЕМХЪ
// МЮ БЯЕ IP-ЮДПЕЯЮ
// БШГШБЮЕЛ bind ДКЪ ЯБЪГШБЮМХЪ
if (bind(mysocket,(sockaddr *) &local_addr,
sizeof(local_addr)))
{
// нЬХАЙЮ
printf("Error bind %d\n",WSAGetLastError());
closesocket(mysocket); // ГЮЙПШБЮЕЛ ЯНЙЕР!
WSACleanup();
return -1;
}
printf("bind() OK\n");
// ьЮЦ 4 НФХДЮМХЕ ОНДЙКЧВЕМХИ
// ПЮГЛЕП НВЕПЕДХ ? 0x100
if (listen(mysocket, 0x100))
{
// нЬХАЙЮ
printf("Error listen %d\n",WSAGetLastError());
closesocket(mysocket);
WSACleanup();
return -1;
}
printf("listen() OK\n");
printf("\t\t\tWaiting for connections...\n");
// ьЮЦ 5 ХГБКЕЙЮЕЛ ЯННАЫЕМХЕ ХГ НВЕПЕДХ
SOCKET client_socket; // ЯНЙЕР ДКЪ ЙКХЕМРЮ
sockaddr_in client_addr; // ЮДПЕЯ ЙКХЕМРЮ
// (ГЮОНКМЪЕРЯЪ ЯХЯРЕЛНИ)
// ТСМЙЖХХ accept МЕНАУНДХЛН ОЕПЕДЮРЭ ПЮГЛЕП
// ЯРПСЙРСПШ
int client_addr_size=sizeof(client_addr);
// ЖХЙК ХГБКЕВЕМХЪ ГЮОПНЯНБ МЮ ОНДЙКЧВЕМХЕ ХГ
// НВЕПЕДХ
while(true)
{
client_socket=accept(mysocket, (sockaddr *) &client_addr, &client_addr_size);
nclients++; // СБЕКХВХБЮЕЛ ЯВЕРВХЙ ОНДЙКЧВХБЬХУЯЪ ЙКХЕМРНБ
// ОШРЮЕЛЯЪ ОНКСВХРЭ ХЛЪ УНЯРЮ
HOSTENT *hst;
hst=gethostbyaddr((char *)
&client_addr.sin_addr.s_addr,4, AF_INET);
// БШБНД ЯБЕДЕМХИ Н ЙКХЕМРЕ
printf("+%s [%s] new connect!\n",
(hst)?hst->h_name:"",
inet_ntoa(client_addr.sin_addr));
// бШГНБ МНБНЦН ОНРНЙЮ ДКЪ НАЯКСФБЮМХЪ ЙКХЕМРЮ
// дЮ, ДКЪ ЩРНЦН ПЕЙНЛЕМДСЕРЯЪ ХЯОНКЭГНБЮРЭ
// _beginthreadex МН, ОНЯЙНКЭЙС МХЙЮЙХУ БШГНБ
// ТСМЙЖХИ ЯРЮМДЮПРМНИ яХ АХАКХНРЕЙХ ОНРНЙ МЕ
// ДЕКЮЕР, ЛНФМН НАНИРХЯЭ Х CreateThread
DWORD thID;
CreateThread(NULL,NULL,ClientThread,
&client_socket,NULL,&thID);
}
return 0;
}
// щРЮ ТСМЙЖХЪ ЯНГДЮЕРЯЪ Б НРДЕКЭМНЛ ОНРНЙЕ Х
// НАЯСФХБЮЕР НВЕПЕДМНЦН ОНДЙКЧВХБЬЕЦНЯЪ ЙКХЕМРЮ
// МЕГЮБХЯХЛН НР НЯРЮКЭМШУ
DWORD WINAPI ClientThread(LPVOID client_socket)
{
SOCKET my_sock;
my_sock=((SOCKET *) client_socket)[0];
char buff[20*1024];
#define sHELLO "Hello, Sailor\r\n"
int len = sizeof(buff);
int llen = sizeof(len);
if (getsockopt(my_sock, SOL_SOCKET, SO_RCVBUF, (char*)&len, &llen) != SOCKET_ERROR) printf("SO_RCVBUF Value: %ld\n", len);
// setsockopt(my_sock, SOL_SOCKET, SO_RCVBUF, (char*)&len, sizeof(len));
// НРОПЮБКЪЕЛ ЙКХЕМРС ОПХБЕРЯРБХЕ
send(my_sock,sHELLO,sizeof(sHELLO),0);
// ЖХЙК ЩУН-ЯЕПБЕПЮ: ОПХЕЛ ЯРПНЙХ НР ЙКХЕМРЮ Х
// БНГБПЮЫЕМХЕ ЕЕ ЙКХЕМРС
int bytes_recv;
do
{
bytes_recv = recv(my_sock,&buff[0],sizeof(buff),0);
send(my_sock,&buff[0],bytes_recv,0);
if(bytes_recv > 0)
printf("%i bytes received:\n%s", bytes_recv, buff);
}
while(bytes_recv != SOCKET_ERROR);
// ЕЯКХ ЛШ ГДЕЯЭ, РН ОПНХГНЬЕК БШУНД ХГ ЖХЙКЮ ОН
// ОПХВХМЕ БНГПЮЫЕМХЪ ТСМЙЖХЕИ recv НЬХАЙХ ?
// ЯНЕДХМЕМХЕ ЙКХЕМРНЛ ПЮГНПБЮМН
nclients--; // СЛЕМЭЬЮЕЛ ЯВЕРВХЙ ЮЙРХБМШУ ЙКХЕМРНБ
printf("-disconnect (channel lost :( )\n");
// ГЮЙПШБЮЕЛ ЯНЙЕР
closesocket(my_sock);
return 0;
}
Клиент:
Код:
#include <stdio.h>
#include <string.h>
#include <winsock2.h>
#include <windows.h>
#define PORT 1025
#define SERVERADDR "127.0.0.1"
int main(int argc, char* argv[])
{
WSADATA wsaData;
printf("TCP DEMO CLIENT\n");
// ьЮЦ 1 - ХМХЖХЮКХГЮЖХЪ АХАКХНРЕЙХ Winsock
if (WSAStartup(0x0202,&wsaData))
{
printf("WSAStart error %d\n",WSAGetLastError());
return -1;
}
printf("WSAStartup() OK\n");
// ьЮЦ 2 - ЯНГДЮМХЕ ЯНЙЕРЮ
SOCKET my_sock;
my_sock=socket(AF_INET,SOCK_STREAM,0);
if (my_sock < 0)
{
printf("Socket() error %d\n",WSAGetLastError());
return -1;
}
printf("socket() OK\n");
// ьЮЦ 3 - СЯРЮМНБЙЮ ЯНЕДХМЕМХЪ
// ГЮОНКМЕМХЕ ЯРПСЙРСПШ sockaddr_in
// СЙЮГЮМХЕ ЮДПЕЯЮ Х ОНПРЮ ЯЕПБЕПЮ
sockaddr_in dest_addr;
dest_addr.sin_family=AF_INET;
dest_addr.sin_port=htons(PORT);
HOSTENT *hst;
// ОПЕНАПЮГНБЮМХЕ IP ЮДПЕЯЮ ХГ ЯХЛБНКЭМНЦН Б
// ЯЕРЕБНИ ТНПЛЮР
if (inet_addr(SERVERADDR)!=INADDR_NONE)
dest_addr.sin_addr.s_addr=inet_addr(SERVERADDR);
else
// ОНОШРЙЮ ОНКСВХРЭ IP ЮДПЕЯ ОН ДНЛЕММНЛС
// ХЛЕМХ ЯЕПБЕПЮ
if (hst=gethostbyname(SERVERADDR))
// hst->h_addr_list ЯНДЕПФХР МЕ ЛЮЯЯХБ ЮДПЕЯНБ,
// Ю ЛЮЯЯХБ СЙЮГЮРЕКЕИ МЮ ЮДПЕЯЮ
((unsigned long *)&dest_addr.sin_addr)[0]=
((unsigned long **)hst->h_addr_list)[0][0];
else
{
printf("Invalid address %s\n",SERVERADDR);
closesocket(my_sock);
WSACleanup();
return -1;
}
// ЮДПЕЯ ЯЕПБЕПЮ ОНКСВЕМ ? ОШРЮЕЛЯЪ СЯРЮМНБХРЭ
// ЯНЕДХМЕМХЕ
if (connect(my_sock,(sockaddr *)&dest_addr,
sizeof(dest_addr)))
{
printf("Connect error %d\n",WSAGetLastError());
return -1;
}
printf("connect() OK\nType quit for quit\n\n");
// ьЮЦ 4 - ВРЕМХЕ Х ОЕПЕДЮВЮ ЯННАЫЕМХИ
char buff[20*1024];
int nsize;
while((nsize=recv(my_sock,&buff[0],
sizeof(buff)-1,0))
!=SOCKET_ERROR)
{
// ЯРЮБХЛ ГЮБЕПЬЮЧЫХИ МНКЭ Б ЙНМЖЕ ЯРПНЙХ
buff[nsize]=0;
// БШБНДХЛ МЮ ЩЙПЮМ
printf("S=>C:%s\n",buff);
// ВХРЮЕЛ ОНКЭГНБЮРЕКЭЯЙХИ ББНД Я ЙКЮБХЮРСПШ
printf("S<=C:"); fgets(&buff[0],sizeof(buff)-1,
stdin);
// ОПНБЕПЙЮ МЮ "quit"
if (!strcmp(&buff[0],"quit\n"))
{
// йНППЕЙРМШИ БШУНД
printf("Exit...");
shutdown(my_sock, 2);
// closesocket(my_sock); not right, but 2do sending mess that client disconnects
WSACleanup();
return 0;
}
// ОЕПЕДЮЕЛ ЯРПНЙС ЙКХЕМРЮ ЯЕПБЕПС
send(my_sock,&buff[0],nsize,0);
}
printf("Recv error %d\n",WSAGetLastError());
closesocket(my_sock);
WSACleanup();
return -1;
}
Социальные закладки