Консультация № 172994
06.10.2009, 23:42
0.00 руб.
0 2 1
Здраствуйте уважаемые эксперты,
пробую написать простое приложение клиент - сервер на сокетах, для пересылки сообщений,
только возникла проблема уже на подключениив приложении исходник сервера и клиента,
в клиенте пишетца, что клиент подключился, а как зделать чтобы в сервере тоже писалось сообщение, что ктото подключился к серверу?
Поделитесь пожалуйста куском кода.
Заранее спасибо,
с уважением, Станислав.

Приложение:
server.cpp----------
#include <winsock2.h>
#include <stdio.h>


int main(int argc, char *argv []) {
int port = 15412; //port
int clients[20]; //massiv klientov
int client = -1;
int recv_length = 0;
int server_sd;
int client_sd;
int fd_max;
int newsd;
int newfd;
int addr_size;
int client_addr_len;
char buff[1024];
fd_set read_set;
fd_set master_set;
WSAData wsaData; // then try this instead
sockaddr_in serv_addr;
sockaddr_in addr_info;
sockaddr_in client_addr;



if (WSAStartup(MAKEWORD(1,1), &wsaData) != 0) { //inicializacija, for win
printf("WSAStartup failed.\n");
exit(1);
}

server_sd = socket(PF_INET, SOCK_STREAM, 0); //sozdajem soket
if (server_sd == -1)
{
printf("Socket failed\n");
return -1;
}

for(int i=0; i < 20; i++) {
clients[i] = -1;
}
memset(&buff, 0, sizeof(buff));
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family=AF_INET;
serv_addr.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
//serv_addr.sin_addr.s_addr = INADDR_ANY;
serv_addr.sin_port=htons(port);

if(SOCKET_ERROR ==bind(server_sd,(sockaddr*) &serv_addr, sizeof(serv_addr))) {
printf("Error...\n");
return -1;
}

addr_size = sizeof(addr_info);
if(SOCKET_ERROR==getsockname(server_sd, (sockaddr*) &addr_info, &addr_size)) {
printf("Error...\n");
return -1;
}

printf("Server IP: %s \n", inet_ntoa((in_addr)addr_info.sin_addr));
printf("Server port: %d \n", ntohs(addr_info.sin_port));

if(FAILED(listen(server_sd, 21))) { //slusajem port
printf("Error...\n");
return -1;
}
printf("Listening...\n");

for(;;) {
FD_ZERO(&read_set); //ocisciajem mnozestvo soketov

for(i = 0; i < 20; i++) { //zapolniajem mnozestvo soketov
if(clients[i] != -1) {
FD_SET(clients[i], &read_set);
if(clients[i] > fd_max) {
fd_max = clients[i];
}
}
}

FD_SET(server_sd, &read_set);
if(server_sd > fd_max) {
fd_max = server_sd;
}

if (select(fd_max+1, &read_set, NULL, NULL, NULL) == -1) {
printf("select error...\n");
return -1;
}

for(int i = 0; i < fd_max; i++) {
if (FD_ISSET(i, &read_set)){
if(i == server_sd) { //we got connection
printf("Ctoto proisxodit..."); //nepisetca
for (i = 0; i < 20; i++){
if (clients[i] == -1){
client = i;
}
}
if(client != -1){
client_addr_len = sizeof(client_addr);
memset(&client_addr, 0, sizeof(client_addr));
clients[client] = accept(server_sd, (struct sockaddr*) &client_addr, &client_addr_len);
if(clients[client] == -1) {
printf("neudalos priniat podkliucenije...\n");
}
printf("podkliucilsia: %s\n",inet_ntoa(client_addr.sin_addr)); //kak sdelat ctoby eto pisalos v programme? ;/
}
} else { //we got data...
printf("...");
for(int j = 0; j < 20; j++) {
if(clients[j] == i) {
printf("------Client %d, socket: %d", j, i);
}
}
if((recv_length = recv(i, buff, sizeof(buff), 0)) <= 0) { //poluciajem soobscenije ot klienta
printf("Klaida gaunant pranesima...");
printf("Gauta: %s", &buff);
closesocket(i);
}

for (j = 0; j < 20; j++){ //peresylajem soobscenije
if (clients[j] != -1){
int send_length = send(clients[j], buff, recv_length,0);
if (send_length <= 0){
closesocket(clients[j]);
clients[j] = -1;
}
}
}
printf("Soobscenije pereslali");
}
}
}
}
system("PAUSE");
}
-----------------
client.cpp
#include <stdio.h>
#include <winsock.h>

int main() {
int port;
WSAData wsaData;
sockaddr_in client_addr;
int client_socket;
char sendbuff[1024];
char recvbuff[1024];

if (WSAStartup(MAKEWORD(1,1), &wsaData) != 0) { //inicializacija, for win
printf("WSAStartup failed.\n");
exit(1);
}

client_socket = socket(PF_INET, SOCK_STREAM, 0);

if (client_socket == -1) {
printf("Socket failed\n");
return -1;
}
port = 15412;
memset(&client_addr, 0, sizeof(client_addr)); //obnuliajem strukturu
client_addr.sin_family=AF_INET;
client_addr.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
client_addr.sin_port=htons(port);

/*if (setsockopt(client_socket, SOL_SOCKET,SO_REUSEADDR,"1",sizeof(int)) == -1) {
perror("setsockopt");
exit(1);
}*/

if((connect(client_socket,(sockaddr*)&client_addr, sizeof(client_addr))) == -1) {
printf("connection failed...\n");
system("PAUSE");
return -1;
}
printf("socket: %d\n", client_socket);
printf("connected\n");
closesocket(client_socket);
system("PAUSE");
}

Обсуждение

Неизвестный
07.10.2009, 06:37
общий
это ответ
Здравствуйте, Станислав.
Найдите строку
Код:
for(int i = 0; i < fd_max; i++) { 

и исправьте ее на
Код:
for(int i = 0; i <= fd_max; i++) { 

давно
Академик
20764
1861
07.10.2009, 08:21
общий
Насколько я знаю, в windows дескрипторы файлов и сокетов в разных диапазонах, так что любой socket() сразу же вернёт значение большее max_fd.
Форма ответа