Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Работа с winsock

33K
04 июля 2008 года
NVirt
8 / / 28.02.2008
учусь работать с winsock, написал две простые проги - сервер и клиент...

клиент.........

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

#include <vcl.h>
#include <winsock2.h>
#include <stdio.h>
#include <conio.h>
#include <iostream.h>
#pragma hdrstop

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

#pragma argsused
int main(int argc, char* argv[])
{
WSADATA lpWSAData;
int s, rc, s1;
char buf[1];
if(WSAStartup(MAKEWORD(1,1), &lpWSAData)!=0) perror("Error: init of Ws2_32.dll");
sockaddr_in peer;
peer.sin_family=AF_INET;
peer.sin_port=htons(7500);
peer.sin_addr.s_addr=inet_addr("127.0.0.1");

s=socket(AF_INET, SOCK_STREAM, 0);
if(s<0) {
perror("Socket");
getch();
exit(1);
}
rc=connect(s, (sockaddr*)&peer, sizeof(peer));
if(rc) {
perror("Connect");
getch();
exit(1);
}
rc=send(s, "1", 1, 0);
if(rc<=0) {
perror("Send");
getch();
exit(1);
}
rc=recv(s, buf, sizeof(buf), 0);
if(rc<=0) perror("Recv"); else cout<<buf[0];
closesocket(s);
WSACleanup();
getch();

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

сервер........

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

#include <vcl.h>
#include <winsock2.h>
#include <stdio.h>
#include <conio.h>
#include <iostream.h>
#pragma hdrstop

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

#pragma argsused
int main(int argc, char* argv[])
{
WSADATA lpWSAData;
int s, rc, s1;
char buf[1];
if(WSAStartup(MAKEWORD(1,1), &lpWSAData)!=0) perror("Error: init of Ws2_32.dll");
sockaddr_in local;
local.sin_family=AF_INET;
local.sin_port=htons(7500);
local.sin_addr.s_addr=htonl(INADDR_ANY);

s=socket(AF_INET, SOCK_STREAM, 0);
if(s<0) {
perror("Socket");
getch();
exit(1);
}
rc=bind(s, (sockaddr*)&local, sizeof(local));
if(rc<0) {
perror("Bind");
getch();
exit(1);
}
rc=listen(s, 5);
if(rc) {
perror("Listen");
getch();
exit(1);
}
s1=accept(s, NULL, NULL);
if(s1<0) {
perror("Accept");
getch();
exit(1);
}
rc=recv(s1, buf, 1, 0);
if(rc<=0) {
perror("Recv");
getch();
exit(1);
}
cout<<buf[0];
rc=send(s1, "2", sizeof(buf), 0);
if(rc<=0) perror("Send");
closesocket(s);
WSACleanup();
getch();

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

в результате, при первом запуске работает все нормально, но когда потом запускаеш сервер работает нормально, появляеться ашипка на клиенте
Recv: Error 0 тоесть в ф-и Recv...Пример частично из книги Снейдера TCP/IP прогр.
7.2K
05 июля 2008 года
polaroid
94 / / 05.07.2008
Хм. Вероятно это связано с тем, что у тебя один поток для всех соединений на серваке. Сделай обработку соединений в несколько потоков. Вот приведу тебе код, правда на делфи, просто под рукой нет кода на C, а переписывать влом))) :
 
Код:
// Цикл обработки соединений:
while (stop = false) do
begin
  clsock:= accept(sock, nil, nil);
  if (clsock <> 0) then
    CreateThread(nil, 0, @OnAccept, nil, 0, tID);
end;


В функции OnAccept просто обрабатываешь соединение (прием, отправка данных) и закрываешь коннект (и сам поток). Переменная clsock должна быть глобальной. Попробуй так, но я гарантий не даю, что заработает на 100% )))
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог