LinuxQuestions.org
Review your favorite Linux distribution.
Go Back   LinuxQuestions.org > Forums > Non-*NIX Forums > Programming
User Name
Password
Programming This forum is for all programming questions.
The question does not have to be directly related to Linux and any language is fair game.

Notices


Reply
  Search this Thread
Old 09-04-2011, 11:35 AM   #1
silentkill89
LQ Newbie
 
Registered: Aug 2011
Posts: 28

Rep: Reputation: Disabled
[QUestion] tcp client and server


Actually I just want to know about how the tcp client respond before the tcp server able to respond in the first place. For example, in same computer, i ran 2 files, which is tcpserver.c and tcpclient.c
once they were both connected, server will ask like this "Send "q" or 'Q" to quit"here is the chat begin, typing q to exit the program)
but i want to make the asking start from the client side instead of the server first. It's like a vice versa,but it stil can communicate with each other.
Code:
/* tcpserver.c */

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>


int main()
{
        int sock, connected, bytes_recieved , true = 1;  
        char send_data [1024] , recv_data[1024];       

        struct sockaddr_in server_addr,client_addr;    
        int sin_size;
        
        if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
            perror("Socket");
            exit(1);
        }

        if (setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,&true,sizeof(int)) == -1) {
            perror("Setsockopt");
            exit(1);
        }
        
        server_addr.sin_family = AF_INET;         
        server_addr.sin_port = htons(5000);     
        server_addr.sin_addr.s_addr = INADDR_ANY; 
        bzero(&(server_addr.sin_zero),8); 

        if (bind(sock, (struct sockaddr *)&server_addr, sizeof(struct sockaddr))
                                                                       == -1) {
            perror("Unable to bind");
            exit(1);
        }

        if (listen(sock, 5) == -1) {
            perror("Listen");
            exit(1);
        }
		
	printf("\nTCPServer Waiting for client on port 5000");
        fflush(stdout);


        while(1)
        {  

            sin_size = sizeof(struct sockaddr_in);

            connected = accept(sock, (struct sockaddr *)&client_addr,&sin_size);

            printf("\n I got a connection from (%s , %d)",
                   inet_ntoa(client_addr.sin_addr),ntohs(client_addr.sin_port));

            while (1)
            {
              printf("\n SEND (q or Q to quit) : ");
              gets(send_data);
              
              if (strcmp(send_data , "q") == 0 || strcmp(send_data , "Q") == 0)
              {
                send(connected, send_data,strlen(send_data), 0); 
                close(connected);
                break;
              }
               
              else
                 send(connected, send_data,strlen(send_data), 0);  

              bytes_recieved = recv(connected,recv_data,1024,0);

              recv_data[bytes_recieved] = '\0';

              if (strcmp(recv_data , "q") == 0 || strcmp(recv_data , "Q") == 0)
              {
                close(connected);
                break;
              }

              else 
              printf("\n RECIEVED DATA = %s " , recv_data);
              fflush(stdout);
            }
        }       

      close(sock);
      return 0;
}
Code:
/* tcpclient.c */

#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>


int main()

{

        int sock, bytes_recieved;  
        char send_data[1024],recv_data[1024];
        struct hostent *host;
        struct sockaddr_in server_addr;  

        host = gethostbyname("127.0.0.1");

        if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
            perror("Socket");
            exit(1);
        }

        server_addr.sin_family = AF_INET;     
        server_addr.sin_port = htons(5000);   
        server_addr.sin_addr = *((struct in_addr *)host->h_addr);
        bzero(&(server_addr.sin_zero),8); 

        if (connect(sock, (struct sockaddr *)&server_addr,
                    sizeof(struct sockaddr)) == -1) 
        {
            perror("Connect");
            exit(1);
        }

        while(1)
        {
        
          bytes_recieved=recv(sock,recv_data,1024,0);
          recv_data[bytes_recieved] = '\0';
 
          if (strcmp(recv_data , "q") == 0 || strcmp(recv_data , "Q") == 0)
          {
           close(sock);
           break;
          }

          else
           printf("\nRecieved data = %s " , recv_data);
           
           printf("\nSEND (q or Q to quit) : ");
           gets(send_data);
           
          if (strcmp(send_data , "q") != 0 && strcmp(send_data , "Q") != 0)
           send(sock,send_data,strlen(send_data), 0); 

          else
          {
           send(sock,send_data,strlen(send_data), 0);   
           close(sock);
           break;
          }
        
        }   
return 0;
}
Im still learning in socket programming, i just need some guidances and examples will do. Thank you
 
Old 09-04-2011, 11:59 AM   #2
silentkill89
LQ Newbie
 
Registered: Aug 2011
Posts: 28

Original Poster
Rep: Reputation: Disabled
Please help me, im urgently need help
 
Old 09-04-2011, 12:29 PM   #3
tbrand
Member
 
Registered: Jul 2006
Location: Toronto, Canada
Distribution: gentoo
Posts: 33

Rep: Reputation: 17
If I understand your question you want the client send some data before the server.

All you need to do is switch the order of reading and writing on the socket in the client and server.

After the client connects (connect()) it should write to the socket and then wait for response.

The server should first read the socket after it comes out of the accept().

You may also need to arrange for some protocol between the client and server indicating end of data or length of data. TCP connection is a data stream and the recv() function only tells you how much data it received not that its all the data.
 
Old 09-04-2011, 12:35 PM   #4
Tinkster
Moderator
 
Registered: Apr 2002
Location: earth
Distribution: slackware by choice, others too :} ... android.
Posts: 23,067
Blog Entries: 11

Rep: Reputation: 928Reputation: 928Reputation: 928Reputation: 928Reputation: 928Reputation: 928Reputation: 928Reputation: 928
Quote:
Originally Posted by silentkill89 View Post
Please help me, im urgently need help
Mate ... this is a forum where volunteers spend their
own unpaid for time supporting others. Don't badger,
and don't bounce your own thread, specially not
after having patiently waited all of 20 minutes.

Read our rules again.


Cheers,
Tink



P.S.: This is better off in programming, and I'm moving it across.
 
Old 09-04-2011, 01:03 PM   #5
silentkill89
LQ Newbie
 
Registered: Aug 2011
Posts: 28

Original Poster
Rep: Reputation: Disabled
Tbrand, i get what you mean, i have tried to switch the reading and writing order,but somehow it just messed up and the whole program gones wrong. Could you kindly show me which part of the client server program i can adjust because i need to get a clear idea on what's going around. Thank you
 
Old 09-04-2011, 01:54 PM   #6
ta0kira
Senior Member
 
Registered: Sep 2004
Distribution: FreeBSD 9.1, Kubuntu 12.10
Posts: 3,078

Rep: Reputation: Disabled
Quote:
Originally Posted by silentkill89 View Post
Tbrand, i get what you mean, i have tried to switch the reading and writing order,but somehow it just messed up and the whole program gones wrong. Could you kindly show me which part of the client server program i can adjust because i need to get a clear idea on what's going around. Thank you
Just switch the while loops between the two programs, making sure to update symbol names as appropriate. If it's easier, switch the bind/listen/accept and connect code between the two. As a third alternative, create 4 functions:
  1. A function to listen to the port.
  2. A function to connect to the port.
  3. A function that writes first, reads second in a loop.
  4. A function that reads first, writes second in a loop.
Put this in a single program and pair choices of 1 or 2 and 3 or 4 depending on whether or not the instance is the client or the server.
Kevin Barry
 
  


Reply


Thread Tools Search this Thread
Search this Thread:

Advanced Search

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is Off
HTML code is Off



Similar Threads
Thread Thread Starter Forum Replies Last Post
[Question] tcp client and server connection problems silentkill89 Programming 6 09-04-2011 08:27 PM
qt tcp client, C tcp server deadeyes Programming 3 09-04-2011 10:23 AM
[SOLVED] TCP server with multiple client connection on the same server port assyrian1 Programming 1 07-16-2011 03:14 AM
Tcp client server development ptlchetan Programming 4 09-15-2006 04:49 AM
Tcp/ip Client Server Problem tushar123 Programming 2 03-31-2004 05:16 PM

LinuxQuestions.org > Forums > Non-*NIX Forums > Programming

All times are GMT -5. The time now is 08:00 AM.

Main Menu
Advertisement
My LQ
Write for LQ
LinuxQuestions.org is looking for people interested in writing Editorials, Articles, Reviews, and more. If you'd like to contribute content, let us know.
Main Menu
Syndicate
RSS1  Latest Threads
RSS1  LQ News
Twitter: @linuxquestions
Open Source Consulting | Domain Registration