ASDFSUSB-гуру (30.12.2013 19:27, просмотров: 142) ответил Codavr на Ну так выложи свой самопал не жмоться
Мой самопал остро заточен под мои задачи и протоколы. Но вот кусманчик из него кому то может помочь при ответе на вопрос какие ключевые слова изучать >>>>
void __fastcall TProXLib::E_ServerStart(TRX_Stat *_Stat, u16_t _port)
{
DWORD i;
_Stat->S = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP);
i = 1; setsockopt (_Stat->S, SOL_SOCKET, SO_RCVTIMEO, (char *)&i, sizeof(i));
i = 100; setsockopt (_Stat->S, SOL_SOCKET, SO_SNDTIMEO, (char *)&i, sizeof(i));
i = 1; setsockopt(_Stat->S, SOL_SOCKET, SO_BROADCAST, (char *)&i, sizeof(i));
_Stat->_addr.sin_family = AF_INET;
_Stat->_addr.sin_port = htons(_port);
_Stat->_addr.sin_addr.s_addr = htonl (INADDR_ANY);
bind(_Stat->S, (SOCKADDR*)&_Stat->_addr, sizeof(_Stat->_addr));
_Stat->Evnt = WSACreateEvent();
WSAEventSelect(_Stat->S, _Stat->Evnt, FD_READ);
_Stat->_TXBufPos = 0;
}
void __fastcall TProXLib::E_ServerTX(TRX_Stat *_Stat, char* _IP)
{
_Stat->_addr.sin_addr.s_addr = inet_addr(_IP);
sendto(_Stat->S, _Stat->_TXBuf, _Stat->_TXBufPos, 0, (SOCKADDR*)&_Stat->_addr, sizeof(_Stat->_addr));
_Stat->_TXBufPos = 0;
}
int __fastcall TProXLib::E_ServerRX(TRX_Stat *_Stat)
{
_Stat->_RXBufPos = 0;
_Stat->_RXBufLen = 0;
if (WSAWaitForMultipleEvents(1, &_Stat->Evnt, true, 0, false) == 0) {
_Stat->_RXBufLen = sizeof (_Stat->_addr);
_Stat->_RXBufLen = recvfrom(_Stat->S, _Stat->_RXBuf, sizeof(_Stat->_RXBuf), 0, (SOCKADDR*)&_Stat->_addr, &_Stat->_RXBufLen);
if ((_Stat->_RXBufLen == SOCKET_ERROR) || (_Stat->_RXBufLen <= 0)) {
int i = WSAGetLastError();
_Stat->_RXBufLen = 0;
// MainWindow->Edit6->Text = Format("%d",ARRAYOFCONST((i)));
}
}
return (_Stat->_RXBufLen);
}
void __fastcall TProXLib::E_ServerFlush(TRX_Stat *_Stat)
{
do {
_Stat->_RXBufLen = 0;
_Stat->_RXBufLen = recvfrom(_Stat->S, _Stat->_RXBuf, sizeof(_Stat->_RXBuf), 0, (SOCKADDR*)&_Stat->_addr, &_Stat->_RXBufLen);
} while (!((_Stat->_RXBufLen == SOCKET_ERROR) || (_Stat->_RXBufLen <= 0)));
}
void __fastcall TProXLib::E_ServerStop(TRX_Stat *_Stat)
{
WSACloseEvent(_Stat->Evnt);
closesocket(_Stat->S);
}