P5e4ten9 dat ze socketu s rcv – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

P5e4ten9 dat ze socketu s rcv – C / C++ – Fórum – Programujte.comP5e4ten9 dat ze socketu s rcv – C / C++ – Fórum – Programujte.com

 

dragon124-10
Stálý člen
11. 11. 2012   #1
-
0
-

Dobrý den,

pochopil jsem, že pomocí rcv mohu ze socketu přečíst data. Jak ale udělat, aby program počkal, než client zadá do telnetu slovo a teprva potom pokračoval. Prostě aby to ve výsledku fungovalo jako cin, ze kterého něco dávam do stringu.

Napadlo mě to udělat nějak pomocí listen, ale to jsem pak zavrhl. Možná nějak s ifem?

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <unistd.h>

#include <fcntl.h>

#include <sys/types.h> 

#include <sys/socket.h>

#include <netinet/in.h>

#include <iostream>



 

void nonblock(int sockfd)

{

    int opts;

    opts = fcntl(sockfd, F_GETFL);

    if(opts < 0)

    {

        fprintf(stderr, "fcntl(F_GETFL) failed\n");

    }

    opts = (opts | O_NONBLOCK);

    if(fcntl(sockfd, F_SETFL, opts) < 0) 

    {

        fprintf(stderr, "fcntl(F_SETFL) failed\n");

    }

}

 

int main(int argc, char *argv[])

{

     int BUFLEN = 2000;

     int sockfd, newsockfd, portno;

     socklen_t clilen;

     char buffer[BUFLEN];

     struct sockaddr_in serv_addr, cli_addr;

     int n, i;

     int one = 1;


 

     if (argc < 2) {

         fprintf(stderr,"please specify a port number\n");

         //exit(1);

     }

     sockfd = socket(AF_INET, SOCK_STREAM, 0);

     if (sockfd < 0) {

        perror("ERROR create socket");

        exit(1);

     }

     setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof one);    //allow reuse of port

     //bind to a local address

     bzero((char *) &serv_addr, sizeof(serv_addr));

     portno = 35;  //atoi(argv[1]);

     serv_addr.sin_family = AF_INET;

     serv_addr.sin_addr.s_addr = INADDR_ANY;

     serv_addr.sin_port = htons(portno);

     if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) {

        perror("ERROR on bind");

        exit(1);

     }

     //listen marks the socket as passive socket listening to incoming connections, 

     //it allows max 5 backlog connections: backlog connections are pending in queue

     //if pending connections are more than 5, later request may be ignored

     listen(sockfd,5);

     //accept incoming connections

     clilen = sizeof(cli_addr);

     newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);

     //nonblock(newsockfd);        //if we want to set the socket as nonblock, we can uncomment this

     if (newsockfd < 0) {

        perror("ERROR on accept");

        exit(1);

     }

     printf("connection accepted\n");
     
         

     char line[15] = "";
     int size = 13;
     recv(sockfd, line, 20, 0);
     send(newsockfd, line, size, 0);
     sleep(500);

     close(newsockfd);

     close(sockfd);

     return 0; 

}

vim, že tam nahoře mam blbost, že to vždy vypíše, že sem nenapsal číslo portu. Problém je po řádce

printf("connection accepted\n");

Program by měl čekat než se někdo připojí. Když se připojí, tak počkat, co client odešle z telnetu a když něco odešle, tak to samé odeslat clientovi z5.

Nahlásit jako SPAM
IP: 89.235.32.–
KIIV
~ Moderátor
+43
God of flame
11. 11. 2012   #2
-
0
-

tam explicitne hodis neblokujici rezim a chces aby to blokovalo?

jinak to musi blokovat defaultne

btw: pokud chces aby to delalo nejakou akci a opakovalo se to, budes muset pridat opakovani

+ hazes pro recv buffer o maximalni delce 15 znaku a pak mu das ze do nej muze zapsat az 20znaku..

Nahlásit jako SPAM
IP: 94.112.32.–
Program vždy dělá to co naprogramujete, ne to co chcete...
dragon12
~ Anonymní uživatel
1 příspěvek
12. 11. 2012   #3
-
0
-

Omlouvám se, ale trochu jsem to nepochopil. Prosím, mohl bys to říci trochu polopatě?.

Nahlásit jako SPAM
IP: 195.113.226.–
ingiraxo+15
Grafoman
12. 11. 2012   #4
-
0
-

tak to dopadá, když někdo skopne kód z netu a pak se diví proč to nejde podle představ :D

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 16 hostů

Podobná vlákna

Bezpečnost socketu — založil exilim

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý