Сокеты
#include <iostream.h>
#include <memory.h>
int main(){
int s,addrlen,from_len,i=0,s_new;
struct sockaddr_in sin;
struct sockaddr from_sin;
char buf[1024];
s = socket(AF_INET,SOCK_STREAM,0);
memset ((char *)&sin, '\0', sizeof(sin));
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = INADDR_ANY;
sin.sin_port = 3333;
bind (s, (struct sockaddr *)&sin, sizeof(sin)); //bind
listen(s,3);
while (i<3){
from_len = sizeof(from_sin);
s_new = accept (s, &from_sin, &from_len);
reсv(s_new, buf, 1024, 0);
cout << buf << "\n";
i++;
}
//...
return 0;
}
Вот так выглядит это в консоли:
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
☻
#include <iostream.h>
#include <winsock2.h>
int main(){
int s,from_len,s_new;
struct sockaddr_in sin;
struct sockaddr_in from_sin;
char buf[512];
s = socket(AF_INET,SOCK_STREAM,0);
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = htonl(INADDR_ANY);
sin.sin_port = htons(3335);
bind (s, (struct sockaddr *)&sin, sizeof(sin)); //bind
listen(s,1);
while (true){};
from_len = sizeof(from_sin);
while((s_new=accept(s, (struct sockaddr *)&from_sin, &from_len)) != INVALID_SOCKET)
{
recv(s_new, buf, 512, 0);
cout << buf << "\n";
}
return 0;
}
Не понимаю, что ему не нравится?
И вот ещё вопрос: как со стороны сервера узнать об отключении клиента (Disconnect)?
WSAStartup(0x0202, &WsaData);
В конце работы приложения:
фрагмент кода сервера:
recv(s_new, buf, 512, 0);
cout << buf << "\n";
}
Помогите плиз!
> И вот ещё вопрос: как со стороны сервера узнать об отключении
> клиента (Disconnect)?
не знаю как это будет под окнами, но смотри на использование флага при приеме\передаче данных MSG_NOSIGNAL
у меня при смерти клиента recv\send возвращает -1 и errno = EPIPE
recv(s_new, buf, 512, 0);
cout << buf << "\n";
}
не совсем верно, нужно проверять возвращаемое значение recv, т.к там может быть не только количество реально прочитанных байт, но и возможная ошибка.
{
l = recv(s_new, buf, 512, 0);
if(l<=0) break;
cout << buf << endl;
}
:)
не знаю как это будет под окнами, но смотри на использование флага при приеме\передаче данных MSG_NOSIGNAL
Это лишнее, и ненужное, все гораздо проще. :-D
[quote=MSDN]If no error occurs, recv returns the number of bytes received. If the connection has been gracefully closed, the return value is zero. Otherwise, a value of SOCKET_ERROR is returned, and a specific error code can be retrieved by calling WSAGetLastError.[/quote]
Если ошибок не произошло, recv возвращает количество принятых байт. Если соединение было закрыто, возвращаемое значение ноль. В другом случае будет возвращено значение равное SOCKET_ERROR (-1), и код ошибки может быть получен вызовом WSAGetLastError().
:)
под окнами мб - не проверял
если не выставить флаг MSG_NOSIGNAL и не обрабатывать сигналы, то просто работа сервера завершается и все