Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Сокеты в билдере.


Автор: olegrolik 25.12.2006, 22:15
Код до тупого прост...:

int i,rv;
char buf;
RichEdit1->Clear();
Update();
SOCKET socket1;
WSADATA winSockData;
sockaddr_in peer;
char ipaddr[25];
sprintf(ipaddr,"%s",Edit4->Text);
// MessageBox(NULL,ipaddr,"",MB_OK);
unsigned short port;
int result,lis;
WSAStartup(0x0101, &winSockData);

socket1 = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
peer.sin_family = AF_INET;
peer.sin_port = htons(7777); 
peer.sin_addr.s_addr = inet_addr(ipaddr); 
result = connect(socket1, (sockaddr *) &peer, sizeof(peer));
if (result != 0) {
RichEdit1->Lines->Add("Couldn't connect to the server!");;
}
else {
RichEdit1->Lines->Add("Port is open");
}
peer.sin_family = AF_INET;
peer.sin_port = htons(7777);
peer.sin_addr.s_addr = inet_addr("87.242.73.175");
bind(socket1, (sockaddr *) &peer, sizeof(peer)); // не знаю - нужно ли это

RichEdit1->Lines->Add(send(socket1,&buf,4096,0));
// Sleep(10);
RichEdit1->Lines->Add(send(socket1,&buf,4096,0));
RichEdit1->Lines->Add(send(socket1,&buf,4096,0));
RichEdit1->Lines->Add(send(socket1,&buf,4096,0));
RichEdit1->Lines->Add(send(socket1,&buf,4096,0));
RichEdit1->Lines->Add(send(socket1,&buf,4096,0));
WSACleanup();
closesocket(socket1);
}

По идее посылаю по адресу 6 раз 4096 байт. В установке соединения проверяю реально ли отсылается 4096*6 байт. В итоге получается, что есть крупное не соответствие (даже при попытке послать 1 раз 4096 байт посылается то 3116 байт, то около 4200). Более того, не все отсылки работают. Первая - всегда, остальные в случайном порядке. Пробовал использовать Sleep() - не помогает. 
Помогите, пожалуйста, решить проблему. Спасибо  smile

Автор: Coder 26.12.2006, 02:46
может char buf[4096]; или память выделить?

и еще, как ты инициализируешь buf? в коде не видно что ты отправляешь

bind() нужен.

а вообще смотри в  MSDN: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wcecomm5/html/wce50samwinsocksamples.asp

Автор: olegrolik 26.12.2006, 11:30
buf у меня инициализируется в самом начале
char buf[4096] не решило проблемы...

bind()... он у меня есть...
Только для чего он?

Автор: olegrolik 26.12.2006, 13:49
Цитата(Coder @ 26.12.2006,  02:46)
может char buf[4096]; или память выделить?

и еще, как ты инициализируешь buf? в коде не видно что ты отправляешь

bind() нужен.

а вообще смотри в  MSDN: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wcecomm5/html/wce50samwinsocksamples.asp

Что такое MSDN? 
Кстати, проблема решается после того, как я уменьшаю размер буфера до 1024, например.

Автор: Vyacheslav 26.12.2006, 19:17
А кто, кстати, обещал, что за один раз отправиться ровно столько, сколько хочется ? smile
Цитата


int send(
  SOCKET s,
  const char* buf,
  int len,
  int flags
);


Return Values
If no error occurs, send returns the total number of bytes sent, which can be less than the number indicated by len. Otherwise, a value of SOCKET_ERROR is returned, and a specific error code can be retrieved by calling 

The successful completion of a send does not indicate that the data was successfully delivered.

If no buffer space is available within the transport system to hold the data to be transmitted, send will block unless the socket has been placed in nonblocking mode. On nonblocking stream oriented sockets, the number of bytes written can be between 1 and the requested length, depending on buffer availability on both client and server computers. The select, WSAAsyncSelect or WSAEventSelect functions can be used to determine when it is possible to send more data.


Автор: olegrolik 26.12.2006, 21:55
Ничего себе... Ну тогда подскажите, пожалуйста, как послать и получить точное кол-во информации...  smile 

Автор: witex 27.12.2006, 01:34
Цитата

socket1 = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
честно, а мне банально эта срока раздражает!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)