Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.220.64.128] |
|
Сообщ.
#1
,
|
|
|
Отправляю бинарные данные на сервер посредством сокетов под WinCE 6.0. Когда отлаживаю программу в студии, получается, что устройство имеет доступ к интернету через комп, посредством Device Center. В этом случае, все работает прекрасно. Если же отключить устройство от компьютера, чтобы оно могло отправлять только через GPRS, то функция connect() отваливается с кодом 10035. Если же закомментировать строчки
unsigned long noblock=1; ioctlsocket( sock,FIONBIO,&noblock ); 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))) { wchar_t errText[128]; wsprintf(errText,L"Connect error %d\n", WSAGetLastError()); write2log(errText); closesocket(sock); WSACleanup(); return 0; } timeval SendTimeout; SendTimeout.tv_sec = 30; SendTimeout.tv_usec = 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,request,count,0)==SOCKET_ERROR) { wchar_t errText[128]; wsprintf(errText,L"Send error %d\n", WSAGetLastError()); write2log(errText); } else { select(0, &fds, NULL, NULL, &SendTimeout); char reply[100]; int nsize=recv(sock,reply,sizeof(reply)-1,0); if(nsize>0) { //обработка ответа } } } fclose(fp); } closesocket(sock); WSACleanup(); return 0; } |
Сообщ.
#2
,
|
|
|
Немного подправил код. Проблема теперь заключается в том, что вываливается send() с ошибкой 10054, но только под GPRS, с компьютера, опять-таки, все нормально. Как это исправить?
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; } |
Сообщ.
#3
,
|
|
|
Цитата bartwell @ Как это исправить? обратитесь в саппорт майкрософта |