client/socket programmering i C

Tags:    c++

Hey...
Hjælp...

Jeg sidder lig med client og server programmering i c, jeg har ikke ret meget erfaring i c...
Jeg køre det to prossor hver for sig, de fungere, men har problemer med at få clienten til at være online hele tiden så jeg kan indtaste min besked som jeg vil.

Og sener skal jeg udviklere programmet til at køre med multithreading hvor flere clients skal kunne tilføjes på serveren. aner heller ikke hvordan...

//Client

/*
* File: clientD.c
* Author: Dana
*
* Created on 24. marts 2009, 12:07
*/

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>

struct sockaddr_in serv_addr;
struct hostent *server;


void error(char *msg) {
perror(msg);
exit(0);
}

void handler(int sfd)
{
int sockfd = sfd;
char buffer[256];


if (connect(sockfd, &serv_addr, sizeof (serv_addr)) < 0) {
error("ERROR connecting");
}

while(1)
{
int n;
printf("\nPlease enter the message: ");

bzero(buffer, 256);

fgets(buffer, 255, stdin);



n = write(sockfd, buffer, strlen(buffer));

if (n < 0) {
error("ERROR writing to socket");
}

bzero(buffer, 256);

n = read(sockfd, buffer, 255);

if (n < 0) {
error("ERROR reading from socket");
}

if (n == 0) {
printf("%s\n", buffer);
fflush(stdin);
}
fflush(stdin);
}
}

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



int sockfd, portno;

if (argc < 3) {
fprintf(stderr, "usage %s hostname port\n", argv[0]);
exit(0);
}

portno = atoi(argv[2]);
sockfd = socket(AF_INET, SOCK_STREAM, 0);

if (sockfd < 0) {
error("ERROR opening socket");
}

server = gethostbyname(argv[1]);

if (server == NULL) {
fprintf(stderr, "ERROR, no such host\n");
exit(0);
}

bzero((char *) & serv_addr, sizeof (serv_addr));
serv_addr.sin_family = AF_INET;

bcopy((char *) server->h_addr, (char *) & serv_addr.sin_addr.s_addr, server->h_length);

serv_addr.sin_port = htons(portno);

handler(sockfd);

return 0;
}




// Serveren

/* A simple server in the internet domain using TCP
The port number is passed as an argument
This version runs forever, forking off a separate
process for each connection
*/
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

void dostuff(int); /* function prototype */
void error(char *msg)
{
perror(msg);
exit(1);
}

int main(int argc, char *argv[])
{
int sockfd, newsockfd, portno, clilen, pid;
struct sockaddr_in serv_addr, cli_addr;

if (argc < 2)
{
fprintf(stderr,"ERROR, no port provided\n");
exit(1);
}

sockfd = socket(AF_INET, SOCK_STREAM, 0);

if (sockfd < 0)
{
error("ERROR opening socket");
}

bzero((char *) &serv_addr, sizeof(serv_addr));
portno = 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)
{
error("ERROR on binding");
}

listen(sockfd,5);
clilen = sizeof(cli_addr);

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

if (newsockfd < 0)
{
error("ERROR on accept");
}

pid = fork();

if (pid < 0)
{
error("ERROR on fork");
}

if (pid == 0)
{
close(sockfd);
dostuff(newsockfd);
exit(0);
}
else close(newsockfd);
} /* end of while */
return 0; /* we never get here */
}

/******** DOSTUFF() *********************
There is a separate instance of this function
for each connection. It handles all communication
once a connnection has been established.
*****************************************/
void dostuff (int sock)
{
int n;
char buffer[256];
char bufferB[6] = {'s','t','a','r','t','H'};

bzero(buffer,256);

n = read(sock,buffer,255);

if (n < 0) error("ERROR reading from socket");

printf("Here is the message: %s\n",buffer);

n = write(sock,"I got your message",18);

if (n < 0) error("ERROR writing to socket");

helloW();
}

void helloW()
{
printf("Hello World");
}

//END

PS: kan heller ikke få helleW(); functionen til blive kaldt... ?!

På forhånd tak...





Hvis du kigger i listen af C/C++ artikler her på udvikleren vil du finde fem artikler om netværksprogrammering og en om multithreading. Det er bare at komme i gang :)

Strictly speaking behøver du ikke multithreading for at håndtere flere klienter. Du kan også bruge nonblocking sockets og en polling mekanisme. Det ser ud til, at du bruger Linux (ud fra inkluderede header filer), så der kan du se på epoll funktionerne.

Jeg regner med en dag at skrive en artikel om select()/poll()/epoll() funktionerne, for de er temmeligt rare at have med at gøre.



Ja men har set det...

Problemet er det hele er i C++, og det kender jeg jo ikke ret meget til...

Så ved det ikke...



Ja men har set det...

Problemet er det hele er i C++, og det kender jeg jo ikke ret meget til...

Så ved det ikke...


Det er bare pakket ind i C++ klasser. Alle kald til socket API'et er stadig C.



Jeg kan se i din kode, at klienten skifter mellem at send til og modtage fra serveren.
Så når du har sendt til serveren sker der ikke mere, før serveren har sendt noget til dig.

Hvis du vil have klienten til både at vente på netværkstraffik og på at der kommer noget fra tastaturet, er du nødt til enten at starte en ekstra tråd, eller at bruge nonblocking IO...nonblocking IO er ret komplekst, så mit råd vil være at starte en tråd til at lytte efter netværkstraffik.



Okay tusin tak... :-) jeg prøver lig at se, ellers skriver ígen...





t