Sockets and Pocket PC
От: Henadzi  
Дата: 13.01.05 18:05
Оценка:
Привет всем.

Есть небольшой вопрос. Есть WiFi соединение между Pocket PC и обычным компом. Делается клиент-сервер приложение для отсылки файлов с Pocket PC на обычный комп. Использую Socket. Файлы посылаются пакетами и время от времени на Send приходят эксцэпшины о переполнениии стека. Пробовал переписать на TcpClient там таже история только приходят уже IOException. Также пробовал менять размер пакета. Пробовал все гонять на обычной сетке между обычными компами, все работает прекрастно. Может у кого есть идеи? Очень срочно надо. Горит проект. Ниже привожу кусок кода как конекчусь и функцию посылки пакета.


public bool Connect(string host, int port)
{
IPEndPoint hostEndPoint;
IPAddress hostAddress = null;
try
{
hostAddress = IPAddress.Parse(host);

hostEndPoint = new IPEndPoint(hostAddress, port);

// Creates the Socket to send data over a TCP connection.
g_socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);


// Connect to the host using its IPEndPoint.
g_socket.Connect(hostEndPoint);
if (!g_socket.Connected)
{
// Connection failed, try next IPaddress.
g_socket = null;
getError("Unable to connect to host");
return false;
}


//User
Encoding ASCII = Encoding.ASCII;
Byte[] byteUserName = ASCII.GetBytes("USER " + g_sUser);
if (!SendOnePacket(CreateBufferToSend(new Byte[] {1,0,0,0,0,(Byte)byteUserName.Length,0},byteUserName)))
return false;

} // End of the try block.

catch(Exception e1)
{
getError(e1.Message);
return false;
}
return true;
}
....
public bool SendOnePacket(Byte[] byteArray)
{
bool bRet = true;
Byte[] byteTempToSend;
int retAll = 0;
int ret = 0;
try
{
do
{
byteTempToSend = new Byte[byteArray.Length — retAll];
Buffer.BlockCopy(byteArray,retAll,byteTempToSend,0,byteArray.Length — retAll);
ret = g_socket.Send(byteTempToSend, byteTempToSend.Length, SocketFlags.None);
if (ret==0)
{
getError("Connection failed");
return false;
}
retAll += ret;
}while (retAll < byteArray.Length);
}
catch (Exception e1)
{
bRet = false;
getError(e1.Message);
}
return bRet;
}

15.01.05 19:52: Перенесено модератором из '.NET' — AndrewVK
Re: Sockets and Pocket PC
От: Denis_Orlov  
Дата: 15.01.05 20:12
Оценка:
Здравствуйте, Henadzi, Вы писали:



H> //User

H> Encoding ASCII = Encoding.ASCII;
H> Byte[] byteUserName = ASCII.GetBytes("USER " + g_sUser);
H> if (!SendOnePacket(CreateBufferToSend(new Byte[] {1,0,0,0,0,(Byte)byteUserName.Length,0},byteUserName)))
H> return false;

H> } // End of the try block.


H> catch(Exception e1)

H> {
H> getError(e1.Message);
H> return false;
H> }
H> return true;
H> }
H>....
H> public bool SendOnePacket(Byte[] byteArray)
H> {
H> bool bRet = true;
H> Byte[] byteTempToSend;
H> int retAll = 0;
H> int ret = 0;
H> try
H> {
H> do
H> {
H> byteTempToSend = new Byte[byteArray.Length — retAll];
H> Buffer.BlockCopy(byteArray,retAll,byteTempToSend,0,byteArray.Length — retAll);
H> ret = g_socket.Send(byteTempToSend, byteTempToSend.Length, SocketFlags.None);
H> if (ret==0)
H> {
H> getError("Connection failed");
H> return false;
H> }
H> retAll += ret;
H> }while (retAll < byteArray.Length);
H> }
H> catch (Exception e1)
H> {
H> bRet = false;
H> getError(e1.Message);
H> }
H> return bRet;
H> }


а в каком месте exception??

в SendOnePacket??? или в куске помеченном //User??
Ну я точно ошибки не знаю, но я бы не делал new Byte[] {1,0,0,0,0,(Byte)byteUserName.Length,0} а вынес бы отдельно это выделение памяти....
посмотри..
Re: Sockets and Pocket PC
От: Denis_Orlov  
Дата: 15.01.05 21:35
Оценка:
В общем, может в предыдущем message я не очень точно выразил мысль, но судя по коду вы выделяете каждый раз новую память под массив.

поэтому new byt[] (bla-bla-bla) надо делать один раз, а не при вызове функции. Если ошибка в другом месте, то бум думать...
Re[2]: Sockets and Pocket PC
От: Henadzi  
Дата: 18.01.05 10:46
Оценка:
Здравствуйте, Denis_Orlov, Вы писали:

D_O>В общем, может в предыдущем message я не очень точно выразил мысль, но судя по коду вы выделяете каждый раз новую память под массив.


D_O>поэтому new byt[] (bla-bla-bla) надо делать один раз, а не при вызове функции. Если ошибка в другом месте, то бум думать...


Спасибо за ответ.
Действительно это ошибка, но проблема все же не в этом
Мне кажется что возможно просто сеть настроена не совсем правильно или проблема в неусточивом соединении. В общем буду разбираться...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.