Ситуация такая: обьявляется сокет для прослушивания порта(любого)
первый вариант:
int error;
char buff[6500];
WSADATA wsaData;
error=WSAStartup(MAKEWORD( 2, 0 ), &wsaData);
if (error==SOCKET_ERROR)
{
Memo1->Lines->Add("произошла ошибка");
WSACleanup();
}
else
{
Memo1->Lines->Add("Инициализация прошла");
}
sockaddr_in sock;
sock.sin_family = AF_INET;
sock.sin_port = htons(port);
sock.sin_addr.s_addr = htonl(INADDR_ANY);
int serv = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (serv == SOCKET_ERROR)
{
Memo1->Lines->Add("Ошибка в сокете");
WSACleanup();
}
else
Memo1->Lines->Add("Сокет ок");
error = bind(serv, (sockaddr*)&sock,sizeof(sock));
if (error == SOCKET_ERROR)
Memo1->Lines->Add("Ошибка в bind");
else
{
Memo1->Lines->Add("bind успешен");
memset(buff,0,strlen(buff));
int fromlen = sizeof(sock);
int rc = recvfrom(serv,buff,sizeof(buff),0,(sockaddr *)&sock,&fromlen);
if (rc==SOCKET_ERROR)
Memo1->Lines->Add("ошибки");
else
Memo1->Lines->Add(buff);
}
Программа зависает до получения пакета, одного в данном случае(потом будет цикл, while ), как сделать, чтоб этого не было?
Надо использовать асинхронный сокет т.е. WSAAsyncSelect()
Но вот беда: параметр wMsg1 как описать в нем?
Второй вариант:
есть функция обьявляю в хендл
public:
....
void __fastcall WMUserN ( TMessage& Msg );
protected:
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_USER + 1, TMessage, WMUserN);
END_MESSAGE_MAP(TForm);
потом
void __fastcall WMUserN ( TMessage& Msg )
{
char buff[65000];
int fromlen = sizeof(sockaddr_in);
int lent=sizeof(buff);
int rev_lent=0;
sockaddr_in sock;
sock.sin_family = AF_INET;
sock.sin_port = htons(port);
sock.sin_addr.s_addr = htonl(INADDR_ANY);
int serv = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (serv != SOCKET_ERROR)
{
while (rev_lent < lent)
{
WSAAsyncSelect(serv,Handle,sizeof(buff),FD_READ);
int rr= recvfrom(serv,buff,lent-rev_lent,0,(sockaddr *)&sock,&fromlen);
if (rr==SOCKET_ERROR)
ShowMessage("Ошибка");
else
{
Memo1->Lines->Add(buff);
rev_lent +=rr;
}
}
}
else
ShowMessage("все плохо");
}
Как это дело связать с сокетом? Код правильно ли я написал?
Потом еще будет дорабатываться до отправления сообщения.