Сейчас на форуме: rmn, Magister Yoda, vasilevradislav, tyns777, zombi-vadim (+4 невидимых) |
eXeL@B —› Программирование —› виндовые сокеты... |
Посл.ответ | Сообщение |
|
Создано: 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 ??? ПОЧЕМУ? } //-------------------------------------------------------------------- ------- |
|
Создано: 12 сентября 2007 19:06 · Поправил: s0larian · Личное сообщение · #2 Вот пара мелких глюков - WSAStartup() должен вызываться только один раз из процесса. С WSACleanup() похожая беда - если один поток уже всё послал а воторой ещё не вытащил данные из OS buffers то это сломает все его сокет ф-ции. Так что двигай WSAStartup() в какой-нить MainForm::Create() а WSACleanup() в MainForm::Destroy() Кста, recv() и send() возвращают кол-во байт и SOCKET_ERROR. Добавь везде проверки и логи. |
|
Создано: 13 сентября 2007 14:36 · Поправил: Alexus2006 · Личное сообщение · #3 |
|
Создано: 17 сентября 2007 09:16 · Поправил: Alexus2006 · Личное сообщение · #4 |
|
Создано: 11 мая 2008 08:41 · Поправил: smex · Личное сообщение · #5 |
|
Создано: 11 мая 2008 09:22 · Личное сообщение · #6 |
eXeL@B —› Программирование —› виндовые сокеты... |
Эта тема закрыта. Ответы больше не принимаются. |