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.