В настоящее время я разрабатываю BSD-подобный API сокетов. Ранее я задавал еще один актуальный вопрос:
Сейчас я использую следующую структуру:
Один поток прослушивания, который открывает новый поток, если соединение установлено:
portTASK_FUNCTION( vModbusServer, pvParameters ) {
int lSocket;
struct sockaddr_in sLocalAddr;
lSocket = lwip_socket(AF_INET, SOCK_STREAM, 0);
if (lSocket < 0) return; // check error
memset((char *)&sLocalAddr, 0, sizeof(sLocalAddr));
sLocalAddr.sin_family = AF_INET;
sLocalAddr.sin_len = sizeof(sLocalAddr);
sLocalAddr.sin_addr.s_addr = htonl(INADDR_ANY);
sLocalAddr.sin_port = MODBUS_PORT;
if (lwip_bind(lSocket, (struct sockaddr *)&sLocalAddr, sizeof(sLocalAddr)) < 0) {
lwip_close(lSocket);
return;
}
if ( lwip_listen(lSocket, 20) != 0 ) {
lwip_close(lSocket);
return;
}
while (1) {
vTaskDelay(1);
int clientfd;
struct sockaddr_in client_addr;
int addrlen=sizeof(client_addr);
clientfd = lwip_accept(lSocket, (struct sockaddr*)&client_addr, (socklen_t)&addrlen);
if (clientfd>0) {
sys_thread_new( "MODBUSResponder", vModbusResponder, ( void * ) &clientfd,
lwipMODBUS_SERVER_STACK_SIZE,
lwipMODBUS_SERVER_PRIORITY );
}
}
lwip_close(lSocket); }
Эта ветка будет создана (ответная ветка):
vModbusResponder( void *pvParameters ) {
char buffer[12];
int nbytes;
int *temp = (int*) pvParameters;
int clientfd = *temp;
do {
nbytes=lwip_recv(clientfd, buffer, sizeof(buffer),0);
if (nbytes>0) { //no error
}
} while (nbytes>0);
lwip_close(clientfd);
vTaskDelete(NULL); }
Это идеально работает для двух соединений (два ответных потока), например, для двух ПК, которые подключаются к встроенному устройству, но если я попытаюсь подключиться к третьему ПК, первое соединение будет разорвано. Я не понимаю, почему это происходит. Соединение разрывается от встроенного устройства (lwip) с помощью RST. Если я подключаю четвертый компьютер, второе соединение разрывается.
Я пробовал следующие вещи:
отредактируйте эту строку так:
определить SYS_THREAD_MAX 30
Может кто-нибудь дать несколько советов? Я что-то не так?