Thread: cannot establish two way communication

  1. #1
    Registered User
    Join Date
    Jan 2012
    Posts
    38

    cannot establish two way communication

    hello, i am trying to implement a client and server program. i have managed to establish one way communication btw client and server where server can continuously receive messages from client until i press Ctrl-C upon which connection closes.

    now i want to establish continuous two way communication. i can paste my code if u want but i wanted to know if there are any specific methods that i should look up and understand how to establish two way communication?? all i did was have both send() and recv() functions inside infinite loops but that didnt do anything!!

    wud appreciate some help!!!!

  2. #2
    Registered User
    Join Date
    Jan 2012
    Posts
    38
    here is my code. this is the farthest i have reached. i just want to now figure out full duplex btw client and server like chatting

    Client:
    Code:
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <errno.h>
    #include <string.h>
    #include <netdb.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    
    
    #define PORT 3490
    #define MAXSIZE 1024
    
    
    int main(int argc, char *argv[])
    {
    	struct sockaddr_in server_info;
    	struct hostent *he;
    	int socket_fd,num;
    	char buffer[1024];
    	
    	char buff[1024];
    	
    	if (argc != 2) {
    		fprintf(stderr, "Usage: client hostname\n");
    		exit(1);
    	}
    	
    	if ((he = gethostbyname(argv[1]))==NULL) {
    		fprintf(stderr, "Cannot get host name\n");
    		exit(1);
    	}
    	
    	if ((socket_fd = socket(AF_INET, SOCK_STREAM, 0))== -1) {
    		fprintf(stderr, "Socket Failure!!\n");
    		exit(1);
    	}
    	
    	memset(&server_info, 0, sizeof(server_info));
    	server_info.sin_family = AF_INET;
    	server_info.sin_port = htons(PORT);
    	server_info.sin_addr = *((struct in_addr *)he->h_addr);
    	if (connect(socket_fd, (struct sockaddr *)&server_info, sizeof(struct sockaddr))<0) {
    		fprintf(stderr, "Connection Failure\n");
    		exit(1);
    	}
    	while(1) {
    		fgets(buffer,MAXSIZE-1,stdin);
    		if ((send(socket_fd,buffer, strlen(buffer),0))== -1) {
    			fprintf(stderr, "Failure Sending Message\n");
    			close(socket_fd);
    			exit(1);
    		}
    		else {
    			printf("Client sent: %s\n",buffer);
    		}		
    		num = recv(socket_fd, buffer, 1023,0);
    		if (num == -1) {
    			fprintf(stderr, "Failure Sending Message\n");
    			close(socket_fd);
    			exit(1);
    			}
    		else if (num == 0) {
    			printf("Connection closed\n");
    			return 0;
    		}
    		buffer[num] = '\0';
    		printf("Client received: %s\n",buffer);			
    		//}
    	}		
    	close(socket_fd);		
    }
    Server:

    Code:
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <errno.h>
    #include <string.h>
    #include <netdb.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    
    
    #define PORT 3490
    #define BACKLOG 10
    
    
    int main()
    {
    	struct sockaddr_in server;
    	struct sockaddr_in dest;
    	int status,socket_fd, client_fd,num;
    	socklen_t size;
    	char buffer[10241];
    	char *buff;
    	
    	if ((socket_fd = socket(AF_INET, SOCK_STREAM, 0))== -1) {
    		fprintf(stderr, "Socket failure!!\n");
    		exit(1);
    	}	
    	memset(&server, 0, sizeof(server));
    	memset(&dest,0,sizeof(dest));
    	server.sin_family = AF_INET;
    	server.sin_port = htons(PORT);
    	server.sin_addr.s_addr = INADDR_ANY; 
    	if ((bind(socket_fd, (struct sockaddr *)&server, sizeof(struct sockaddr )))== -1)	 { //sizeof(struct sockaddr) 
    		fprintf(stderr, "Binding Failure\n");
    		exit(1);
    	}	
    	if ((listen(socket_fd, BACKLOG))== -1){
    		fprintf(stderr, "Listening Failure\n");
    		exit(1);
    	}	
    	while(1) {
    		size = sizeof(struct sockaddr_in);	
    		if ((client_fd = accept(socket_fd, (struct sockaddr *)&dest, &size))==-1) {
    			//fprintf(stderr,"Accept Failure\n");
    			perror("accept");
    			exit(1);
    		}
    		printf("Server got connection from client %s\n", inet_ntoa(dest.sin_addr));
    		while(1) {
    			
    			if ((num = recv(client_fd, buffer, 1024,0))== -1) {
    				perror("recv");
    				exit(1);
    			}	
    			else if (num == 0) {
    				printf("Connection closed\n");
    				return 0;
    			}
    		buffer[num] = '\0';
    		printf("Server received: %s\n", buffer);
    		fgets(buffer,1023,stdin);
    		if (send(client_fd,buffer,strlen(buffer),0)==-1) {
    			fprintf(stderr,"Failure sending message\n");
    			close(client_fd);
    			exit(1);
    		}
    		else {
    		printf("Server sent: %s\n", buffer);
    		
    		}
    	}
    	close(client_fd);	
    	close(socket_fd);	
    	
    	}
    
    
    	return 0;
    }

  3. #3
    Registered User Annonymous's Avatar
    Join Date
    Apr 2011
    Location
    Jackson, New Jersey, United States
    Posts
    302
    If you want an asynchronous chat, you need to have a look at the select or poll functions. From the looks of your code though, I think you will have a hard time integrating either function.

    I fixed your code up a bit.

    CLIENT:
    Code:
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <string.h>
    #include <netdb.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    
    int main(int argc, char *argv[])
    {
    	struct sockaddr_in server_info;
    	struct hostent *he;
    	int socket_fd, num, portno, yes = 1;
    	char buffer[1024];
    	
    	if (argc != 3) {
    		printf("USAGE: %s + hostname + port\n", argv[0]);
    		exit(1);
    	}
    	
    	if ((he = gethostbyname(argv[1]))==NULL) {
    		fprintf(stderr, "Cannot get host name\n");
    		exit(1);
    	}
    	
    	if ((socket_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
    		fprintf(stderr, "Socket Failure!!\n");
    		exit(1);
    	}
    
    	setsockopt(socket_fd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes));	
    
    	memset(&server_info, 0, sizeof(server_info));
    	portno = atoi(argv[2]);
    	server_info.sin_family = AF_INET;
    	server_info.sin_port = htons(portno);
    	memcpy(&server_info.sin_addr.s_addr, he->h_addr, he->h_length);
    	//or you could use -> server_info.sin_addr.s_addr = htonl(INADDR_ANY);
    	if (connect(socket_fd, (struct sockaddr *)&server_info, sizeof(server_info)) < 0) {
    		fprintf(stderr, "Connection Failure\n");
    		exit(1);
    	}
    	while(1) {
    		memset(buffer, 0, sizeof(buffer));
    		printf("Message: ");
    		fgets(buffer, sizeof(buffer), stdin);
    		if ((send(socket_fd, buffer, strlen(buffer), 0)) < 0) {
    			fprintf(stderr, "Failure Sending Message\n");
    			close(socket_fd);
    			exit(1);
    		}
    	
    		num = recv(socket_fd, buffer, sizeof(buffer), 0);
    		if (num == -1) {
    			fprintf(stderr, "Failure Sending Message\n");
    			close(socket_fd);
    			exit(1);
    			}
    		else if (num == 0) {
    			printf("Connection closed\n");
    			return 0;
    		}
    		
    		printf("Server: %s\n",buffer);			
    
    	}		
    	close(socket_fd);		
    }
    SERVER:
    Code:
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <string.h>
    #include <netdb.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <errno.h>
    
    int main(int argc, char *argv[])
    {
    	if(argc < 3) {
    	printf("USAGE: %s + hostaddr + port.\n", argv[0]);
    	exit(1);
    	}
    
    	struct sockaddr_in server;
    	struct sockaddr_in dest;
    	struct hostent *he;
    	int socket_fd, client_fd, num, portno, yes = 1;
    	socklen_t size;
    	char buffer[1024];
    	
    	if ((socket_fd = socket(AF_INET, SOCK_STREAM, 0))== -1) {
    		fprintf(stderr, "Socket failure!!\n");
    		exit(1);
    	}
    	
    	if(socket_fd) {
    	  do {
    	    {
    	    printf("waiting for a connection.\n");
    	    }
    	  } while(!accept);
    	}
    
    	setsockopt(socket_fd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes));
    
    	he = gethostbyname(argv[1]);
    	if(he == NULL) {
    	//This error handling requires errno.h
    	printf("GETHOSTBYNAME(NULL) error --> %s.\n", strerror(errno));
    	exit(1);
    	}
    
    	memset(&server, 0, sizeof(server));
    	memset(&dest,0,sizeof(dest));
    	portno = atoi(argv[2]);
    	server.sin_family = AF_INET;
    	server.sin_port = htons(portno);
    	memcpy(&server.sin_addr.s_addr, he->h_addr, he->h_length);
    	if ((bind(socket_fd, (struct sockaddr *)&server, sizeof(server)))== -1)	 { 
    		fprintf(stderr, "Binding Failure\n");
    		close(socket_fd);
    		exit(1);
    	}	
    	if ((listen(socket_fd, 10))== -1){
    		fprintf(stderr, "Listening Failure\n");
    		exit(1);
    	}	
    	
    		size = sizeof(dest);	
    		if ((client_fd = accept(socket_fd, (struct sockaddr *)&dest, &size))==-1) {
    			//fprintf(stderr,"Accept Failure\n");
    			perror("accept");
    			exit(1);
    		}
    
    		printf("Server got connection from client %s\n", inet_ntoa(dest.sin_addr));
    		while(1) {
    			
    			memset(buffer, '\0', sizeof(buffer));			
    			if ((num = recv(client_fd, buffer, sizeof(buffer), 0)) < 0) {
    				perror("recv");
    				exit(1);
    			}	
    
    			else if (num == 0) {
    				printf("Connection closed\n");
    				return 0;
    			}
    
    		printf("Client: %s\n", buffer);
    
    		printf("Message: ");
    		fgets(buffer, sizeof(buffer), stdin);
    		if (send(client_fd, buffer, strlen(buffer), 0) < 0) {
    			fprintf(stderr,"Failure sending message\n");
    			close(client_fd);
    			exit(1);
    		}
    
    	}
    	close(client_fd);	
    	close(socket_fd);	
    	
    
    	return 0;
    }

  4. #4
    Registered User
    Join Date
    Jan 2012
    Posts
    38
    why will it be a hard time integrating select and poll??
    also, i used fork() to enable full duplex communication....is that ok too?? or is the select/poll method a better solution??

Popular pages Recent additions subscribe to a feed

Similar Threads

  1. PHP to C++ Communication
    By Dae in forum C++ Programming
    Replies: 3
    Last Post: 07-27-2009, 09:48 AM
  2. establish a connection using TCP and capture the incoming packets
    By shraddha in forum Networking/Device Communication
    Replies: 12
    Last Post: 10-22-2005, 02:15 AM
  3. Looking for communication lib
    By BrownB in forum C Programming
    Replies: 3
    Last Post: 04-27-2005, 10:01 AM
  4. C++ and PHP communication
    By Korhedron in forum Game Programming
    Replies: 4
    Last Post: 01-12-2004, 06:37 AM
  5. Establish newsgroup..
    By Nutshell in forum A Brief History of Cprogramming.com
    Replies: 5
    Last Post: 04-19-2002, 10:06 PM