Видимость из другого потока
От: solvitz Украина  
Дата: 17.12.13 15:17
Оценка:
Имеется приложение на языке Си, которое собирается в 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 присходит что-то с дескриптором сокета, но как это может повлиять
на сокет созданный в другом потоке?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.