4
4xter
Народ, всем доброго дня=) такая проблемка имеется сервак, к которому подключаются клиенты и который обрабатывает набор данных и отправляет клиенту. Так вот всё отрабатывает правильно и рассчитывает всё здорово, но вот сервак постоянно идет по циклу считывания данных с сокета и причем постоянно. В чем беда не могу понять. Очень надеюсь на вашу помощь.
Вот код серкера. Он получает 2 координаты и возвращает номер четверти, в которой расположена точка:
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">"Сервер"</div></div><div class="sp-body"><div class="sp-content">#include <winsock2.h>
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
int main()
{
WORD wVersionRequested;
WSADATA wsaData;
wVersionRequested=MAKEWORD(2,2);
WSAStartup(wVersionRequested,&wsaData);//инициализация WinSock API
//Создание сокета
SOCKET s=socket(AF_INET,SOCK_STREAM,0);
//структура адреса
struct sockaddr_in local;
local.sin_family=AF_INET;
local.sin_port=htons(1280);
local.sin_addr.s_addr=htons(INADDR_ANY); //хранится физический IP
int c=bind(s,(struct sockaddr*)&local,sizeof(local));
//помещает сокет в состояние прослушивания
int r=listen(s,5);
while (true)
{
char b1[255];
//b1 = (char*)malloc(strlen(b1) + 1);
char *b2,*Res,*token,*tmp;
int x,y;
b2 = (char*)malloc(strlen(b1) + 1);
//free(b2);
//Структура определяет удаленный адрес
//с которым соединяется сокет
sockaddr_in remote_addr;
int size=sizeof(remote_addr);
SOCKET s2=accept(s,(struct sockaddr*)&remote_addr,&size);
if (s2 == INVALID_SOCKET)
continue;
cout << "Client connected..." << endl;
while(recv(s2,b1,sizeof(b1),0)!=0)
{
int mas[2],x,y,n=0,res=0;
char cset[] = "1234567890-";
//Разбитие на координаты.
tmp=new char[strlen(b1)];
strcpy(tmp,b1);
token = strtok(tmp,";");
while( token != NULL )
{
int fl=0;
char * pch = token;
if (pch[0]=='-')
fl=1;
while(!isdigit(*pch))
{pch++;}
if (pch!=NULL)
{
if (fl==0)
mas[n]=atoi(pch);
else
mas[n]=atoi(pch)*(-1);
n++;
}
token = strtok( NULL,";");
}
x=mas[0];
y=mas[1];
if ((x>0)&&(y>0))
res=1;
else if ((x<0)&& (y>0))
res=2;
else if ((x<0)&& (y<0))
res=3;
else if ((x>0)&& (y<0))
res=4;
_itoa(res,b2,10);
Res=new char[strlen(b2)+1];
strcpy(Res,b2);
Res[strlen(b2)]='\0';
send(s2,Res,sizeof(Res),0);
cout << "Message sent"<< endl;
}
closesocket(s2);
//delete []Res;
//free(b1);
}
WSACleanup();
return 0;
}
Вот код серкера. Он получает 2 координаты и возвращает номер четверти, в которой расположена точка:
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">"Сервер"</div></div><div class="sp-body"><div class="sp-content">#include <winsock2.h>
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
int main()
{
WORD wVersionRequested;
WSADATA wsaData;
wVersionRequested=MAKEWORD(2,2);
WSAStartup(wVersionRequested,&wsaData);//инициализация WinSock API
//Создание сокета
SOCKET s=socket(AF_INET,SOCK_STREAM,0);
//структура адреса
struct sockaddr_in local;
local.sin_family=AF_INET;
local.sin_port=htons(1280);
local.sin_addr.s_addr=htons(INADDR_ANY); //хранится физический IP
int c=bind(s,(struct sockaddr*)&local,sizeof(local));
//помещает сокет в состояние прослушивания
int r=listen(s,5);
while (true)
{
char b1[255];
//b1 = (char*)malloc(strlen(b1) + 1);
char *b2,*Res,*token,*tmp;
int x,y;
b2 = (char*)malloc(strlen(b1) + 1);
//free(b2);
//Структура определяет удаленный адрес
//с которым соединяется сокет
sockaddr_in remote_addr;
int size=sizeof(remote_addr);
SOCKET s2=accept(s,(struct sockaddr*)&remote_addr,&size);
if (s2 == INVALID_SOCKET)
continue;
cout << "Client connected..." << endl;
while(recv(s2,b1,sizeof(b1),0)!=0)
{
int mas[2],x,y,n=0,res=0;
char cset[] = "1234567890-";
//Разбитие на координаты.
tmp=new char[strlen(b1)];
strcpy(tmp,b1);
token = strtok(tmp,";");
while( token != NULL )
{
int fl=0;
char * pch = token;
if (pch[0]=='-')
fl=1;
while(!isdigit(*pch))
{pch++;}
if (pch!=NULL)
{
if (fl==0)
mas[n]=atoi(pch);
else
mas[n]=atoi(pch)*(-1);
n++;
}
token = strtok( NULL,";");
}
x=mas[0];
y=mas[1];
if ((x>0)&&(y>0))
res=1;
else if ((x<0)&& (y>0))
res=2;
else if ((x<0)&& (y<0))
res=3;
else if ((x>0)&& (y<0))
res=4;
_itoa(res,b2,10);
Res=new char[strlen(b2)+1];
strcpy(Res,b2);
Res[strlen(b2)]='\0';
send(s2,Res,sizeof(Res),0);
cout << "Message sent"<< endl;
}
closesocket(s2);
//delete []Res;
//free(b1);
}
WSACleanup();
return 0;
}