WinCE + socket
От: bartwell  
Дата: 24.06.12 11:58
Оценка:
Проблема заключается в том, что вываливается send() с ошибкой 10054, но только под GPRS, с компьютера, когда подключено через Device Center, все нормально. Как это исправить?
DWORD WINAPI sender(DWORD param) {
    WSADATA wsaData;
    if(WSAStartup(MAKEWORD(2,2), &wsaData)) {
        write2log(L"WSAStartup error");
        WSACleanup();
        return 0;
    }

    SOCKET sock;

    sock = socket(AF_INET, SOCK_STREAM, 0);
    if(sock < 0) {
        wchar_t errText[128];
        wsprintf(errText,L"Socket error %d\n", WSAGetLastError());
        write2log(errText);
        return 0;
    }

    unsigned long noblock=1;
    ioctlsocket( sock,FIONBIO,&noblock );

    sockaddr_in dest_addr;
    dest_addr.sin_family = AF_INET;
    dest_addr.sin_port = htons(SERVER_PORT);
    HOSTENT *hst;

    if(inet_addr(SERVER_ADDR)!=INADDR_NONE) dest_addr.sin_addr.s_addr = inet_addr(SERVER_ADDR);
    else {
        if(hst=gethostbyname(SERVER_ADDR)) ((unsigned long *)&dest_addr.sin_addr)[0]=((unsigned long **)hst->h_addr_list)[0][0];
        else {
            wchar_t errText[128];
            wsprintf(errText,L"Invalid address %s\n", SERVER_ADDR);
            write2log(errText);
            closesocket(sock);
            WSACleanup();
        }
    }

    if(connect(sock, (sockaddr *)&dest_addr, sizeof(dest_addr))) {
        int err=WSAGetLastError();
        if(err!=WSAEWOULDBLOCK && err!=WSAEINPROGRESS) {
            wchar_t errText[128];
            wsprintf(errText,L"Connect error %d\n", err);
            write2log(errText);
            closesocket(sock);
            WSACleanup();
            return 0;
        }
    }

    timeval sockTimeout;
    sockTimeout.tv_sec  = 30;
    sockTimeout.tv_usec = 0;

    fd_set writefds;
    FD_ZERO(&writefds);
    FD_SET(sock, &writefds);
    if(select(sock, NULL, &writefds, NULL, &sockTimeout)==1 && FD_ISSET(sock, &writefds)) {
        write2log(L"Connection OK");
    } else {
        wchar_t errText[128];
        wsprintf(errText,L"Connection error %d\n", WSAGetLastError());
        write2log(errText);
        closesocket(sock);
        WSACleanup();
        return 0;
    }

    fd_set fds;
    FD_ZERO(&fds);
    FD_SET(sock, &fds);

    FILE * fp=_wfopen(path,L"rb");
    if(fp!=NULL) {
        char buff[160];
        while(!feof(fp)) {
            int count=fread(&buff,sizeof(char),160,fp);
            if(send(sock,buff,count,0)==SOCKET_ERROR) {
                wchar_t errText[128];
                wsprintf(errText,L"Send error %d\n", WSAGetLastError());
                write2log(errText);
            } else {
                select(0, &fds, NULL, NULL, &sockTimeout);
                char reply[100];
                DWORD argp;
                ioctlsocket(sock,FIONREAD,&argp);
                if(argp>0) {
                    argp=(argp>sizeof(reply)-1)?sizeof(reply)-1:argp;
                    int nsize=recv(sock,reply,argp,0);
                    if(nsize>0) {
                        //Обработка ответа
                    } else sent=false;
                } else sent=false;
            }
        }
        fclose(fp);
    }
    closesocket(sock);
    WSACleanup();
    return 0;
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.