Имеется приложение на языке Си, которое собирается в MinGW. Приложение сетевое и многопоточное.
Для своей работы использует часть другого проекта, котороя вынесена в отдельный файл.
Структура приложения такая: main.c и main.h (основное приложение), net.c и net.h (сторонний компонент).
В main.c располагается создание потоков. Там их создается несколько десятков.
В net. c располагается работа с сетью. Расположено большое количество функций.
Но из main.c вызывается всего одна, котороя расположена в net.c. Она объявляется в main.h так:
extern DWORD send_data(char* ip, unsigned short port);
То есть, у меня в main.c из каждого потока вызывается ф-ия: send_data("127.0.0.1", 4000);
Каждый отдельный поток работает с отдельным IP. Строка для сборки проекта выглядит так:
gcc main.c net.c -lws2_32 -lkernel32 -lmsvcrt -nostdlib -Wl,--entry=_start -std=gnu99 -o main.exe
Суть проблемы заключается вот в чем. При работе одного потока все работает прекрасно, но когда
начинает работать несколько потоков происходит ошибка. Допустим работает 2 потока, один из них
так и не отсылает данные, а во втором WSAGetLastError() показывает, что не может сделать connect
из-за отсутсвующего сокета. Вот этот фрагмент в файле net.c:
#include "net.h"
int sock;
VOID func()
{
return;
}
DWORD send_data(char* ip, unsigned short port)
{
struct sockaddr_in target_ip;
target_ip.sin_family = AF_INET;
target_ip.sin_addr.s_addr = inet_addr(ip);
target_ip.sin_port = htons(port);
sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(sock == INVALID_SOCKET)
{
return 0;
}
if (connect(sock, (struct sockaddr *)&target_ip, sizeof(target_ip)) != 0)
{
closesocket(sock);
return 0;
}
func();
return 1;
}
Скажите пожалуйста как такое происходит, ведь ф-ия send_data вызывается из другого потока?
Я так понимаю, что где-то внутри net.c присходит что-то с дескриптором сокета, но как это может повлиять
на сокет созданный в другом потоке?