Сейчас на форуме: rmn, Magister Yoda, vasilevradislav, tyns777, zombi-vadim (+4 невидимых)

 eXeL@B —› Программирование —› виндовые сокеты...
Посл.ответ Сообщение

Ранг: 34.6 (посетитель)
Активность: 0.030
Статус: Участник

Создано: 12 сентября 2007 14:45
· Личное сообщение · #1

блин еррор WSAECONNABORTED 10053
всё вроде просто:
#include <vcl.h>
#include <Winsock2.h>//ws2_32.lib
#include <Mswsock.h>//Mswsock.lib
#include <windows.h>
#include <iostream.h>
#include <conio.h>

#pragma hdrstop

#include "Unit1.h"
//-------------------------------------------------------------------- -------

DWORD WINAPI CreateServerSocket(LPVOID ptr);
DWORD WINAPI SrvRecv(LPVOID AcceptedSock);
void Write(AnsiString Text);
bool fMode=false;

//-------------------------------------------------------------------- -------

//КЛИЕНТ КОННЕКТИТСЯ

void __fastcall TForm1::Button1Click(TObject *Sender)
{
SOCKET sTransmit;
SOCKADDR_IN InetAddr;

HANDLE hFile;
DWORD dwNumRead, fSize, fSizeCur;
BOOL bTest=true;
DWORD dwBuffer[1024];
String fHead, FileName;
WSADATA wsaData;

if(!WSAStartup(0x0202,&wsaData))
{
if((sTransmit = socket(AF_INET, SOCK_STREAM, 0)) != INVALID_SOCKET)
{
Memo1->Lines->Add("socket create ok");
InetAddr.sin_family = AF_INET;
InetAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); // htonl(INADDR_ANY);
InetAddr.sin_port = htons(25600);
if(connect(sTransmit,(struct sockaddr *)&InetAddr,sizeof(InetAddr)) != SOCKET_ERROR)
{
Memo1->Lines->Add("connect to 127.0.0.1:25600 ok");
FileName = "F:\Paraziti.avi";
FileName = "user.txt";
hFile=CreateFile(FileName.c_str(), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if(hFile != INVALID_HANDLE_VALUE)
{
fSizeCur = 0;
fSize = GetFileSize(hFile, NULL);
fHead = "::"+FileName+"::"+IntToStr(fSize)+"::";
send(sTransmit, fHead.c_str(), fHead.Length(), 0);
while (fSizeCur < fSize){
memset(dwBuffer, 0, sizeof(dwBuffer));
bTest = ReadFile(hFile, dwBuffer, sizeof(DWORD)*1024, &dwNumRead, NULL);
fSizeCur = fSizeCur + dwNumRead;
send(sTransmit, (char *)dwBuffer, dwNumRead, 0);
}
//BOOL bResult = TransmitFile(sTransmit, hFile, 0/*целеком*/, 1024, NULL, 0, TF_REUSE_SOCKET);
Memo1->Lines->Add(IntToStr(WSAGetLastError()));
CloseHandle(hFile);
closesocket(sTransmit);
WSACleanup();
}
//-------------------------------------------------------------------- -------

//ПОТОК ДЛЯ СЕРВЕРА (ACCEPT)
DWORD WINAPI CreateServerSocket(LPVOID ptr)
{
SOCKET S, AcceptedSock;
SOCKADDR_IN Addr;
int Len;
WSADATA wsaData;
char *chBuffer;

if(!WSAStartup(0x0202,&wsaData))
{
if((S = socket(AF_INET,SOCK_STREAM,0)) != INVALID_SOCKET)
{
Addr.sin_family = AF_INET;
Addr.sin_addr.s_addr = htonl(INADDR_ANY);
Addr.sin_port = htons(25600);
memset(Addr.sin_zero, sizeof(Addr.sin_zero), 0);
bind(S, (SOCKADDR *)&Addr,sizeof(SOCKADDR_IN));
listen(S, SOMAXCONN);
Len = sizeof(SOCKADDR_IN);
while (1) {
AcceptedSock = accept(S, (SOCKADDR *)&Addr, &Len);
Form1->Memo1->Lines->Add("Connected from: "+IntToStr(Addr.sin_addr.S_un.S_un_b.s_b1)+"."+IntToStr(Addr.sin_addr. S_un.S_un_b.s_b2)+"."+IntToStr(Addr.sin_addr.S_un.S_un_b.s_b3)+"."+Int ToStr(Addr.sin_addr.S_un.S_un_b.s_b4)+":"+IntToStr(Addr.sin_port));
int i = recv(AcceptedSock, chBuffer, 30, 0);
Form1->Memo1->Lines->Add(IntToStr(WSAGetLastError()));
HANDLE hThread = hThread=CreateThread(NULL, 0, SrvRecv, &AcceptedSock, 0, 0);
SetThreadPriority(hThread,THREAD_PRIORITY_NORMAL);
}
}
else {Form1->Memo1->Lines->Add("INVALID_SOCKET");}
}
else{Form1->Memo1->Lines->Add("Error WSAStartup");}

return 0;
}
//-------------------------------------------------------------------- -------

//СТАРТ СЕРВЕРА

void __fastcall TForm1::Button2Click(TObject *Sender)
{
HANDLE hThread = hThread=CreateThread(NULL, 0, CreateServerSocket, 0, 0, 0);
SetThreadPriority(hThread,THREAD_PRIORITY_NORMAL);
}
//-------------------------------------------------------------------- -------

//ПОТОК ДЛЯ чтения
DWORD WINAPI SrvRecv(LPVOID AcceptedSock){
char *chBuffer;
int i=0;
SOCKET RecvSock;
RecvSock = ((SOCKET *) AcceptedSock)[0];
i = recv(RecvSock, chBuffer, 30, 0); //ВОТ ТУТ WSAECONNABORTED 10053 ??? ПОЧЕМУ?
}
//-------------------------------------------------------------------- -------




Ранг: 387.4 (мудрец)
Активность: 0.170
Статус: Участник
системщик

Создано: 12 сентября 2007 19:06 · Поправил: s0larian
· Личное сообщение · #2

Вот пара мелких глюков - WSAStartup() должен вызываться только один раз из процесса. С WSACleanup() похожая беда - если один поток уже всё послал а воторой ещё не вытащил данные из OS buffers то это сломает все его сокет ф-ции. Так что двигай WSAStartup() в какой-нить MainForm::Create() а WSACleanup() в MainForm::Destroy()

Кста, recv() и send() возвращают кол-во байт и SOCKET_ERROR. Добавь везде проверки и логи.



Ранг: 34.6 (посетитель)
Активность: 0.030
Статус: Участник

Создано: 13 сентября 2007 14:36 · Поправил: Alexus2006
· Личное сообщение · #3

"... An application must call one WSACleanup call for every successful WSAStartup call ..."
т.е. WSAStartup можно вызывать много раз, но WSACleanup ровно столько же...



Ранг: 34.6 (посетитель)
Активность: 0.030
Статус: Участник

Создано: 17 сентября 2007 09:16 · Поправил: Alexus2006
· Личное сообщение · #4

Кто нибудь ответьте мне на вопрос... Сильно ли должна отличаться скорость при передачи файла через сокеты на интерфейс 127.0.0.1 и при простом копировании... ну я допускаю что через сокеты раза в 2-4 медленее до не в 200 же раз в чем проблема скажите пжлста?
Вопрос СНЯТ!



Ранг: 31.5 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 11 мая 2008 08:41 · Поправил: smex
· Личное сообщение · #5

Мдяя, вместо того чтобы попробывать то что подсказал Solarian ты настаиваеш на своем. Толку тогда было обращаться на форум?
Насчет твоей проги - попробуй буфер до 4кб поставить, у мя с localhost скорость почти такая же как при копировании.




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 11 мая 2008 09:22
· Личное сообщение · #6

А ты дату видел? Закрыто. Ещё раз всем варнинг, смотрите на дату, ядрён-батон.


 eXeL@B —› Программирование —› виндовые сокеты...
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати