Проблема заключается в том, что вываливается 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;
}