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 |
Welcome to LinuxQuestions.org, a friendly and active Linux Community.
You are currently viewing LQ as a guest. By joining our community you will have the ability to post topics, receive our newsletter, use the advanced search, subscribe to threads and access many other special features. Registration is quick, simple and absolutely free. Join our community today!
Note that registered members see fewer ads, and ContentLink is completely disabled once you log in.
Are you new to LinuxQuestions.org? Visit the following links:
Site Howto |
Site FAQ |
Sitemap |
Register Now
If you have any problems with the registration process or your account login, please contact us. If you need to reset your password, click here.
Having a problem logging in? Please visit this page to clear all LQ-related cookies.
Get a virtual cloud desktop with the Linux distro that you want in less than five minutes with Shells! With over 10 pre-installed distros to choose from, the worry-free installation life is here! Whether you are a digital nomad or just looking for flexibility, Shells can put your Linux machine on the device that you want to use.
Exclusive for LQ members, get up to 45% off per month. Click here for more info.
|
|
09-04-2011, 11:35 AM
|
#1
|
LQ Newbie
Registered: Aug 2011
Posts: 28
Rep:
|
[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
|
|
|
09-04-2011, 11:59 AM
|
#2
|
LQ Newbie
Registered: Aug 2011
Posts: 28
Original Poster
Rep:
|
Please help me, im urgently need help
|
|
|
09-04-2011, 12:29 PM
|
#3
|
Member
Registered: Jul 2006
Location: Toronto, Canada
Distribution: gentoo
Posts: 33
Rep:
|
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.
|
|
|
09-04-2011, 12:35 PM
|
#4
|
Moderator
Registered: Apr 2002
Location: earth
Distribution: slackware by choice, others too :} ... android.
Posts: 23,067
|
Quote:
Originally Posted by silentkill89
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.
|
|
|
09-04-2011, 01:03 PM
|
#5
|
LQ Newbie
Registered: Aug 2011
Posts: 28
Original Poster
Rep:
|
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
|
|
|
09-04-2011, 01:54 PM
|
#6
|
Senior Member
Registered: Sep 2004
Distribution: FreeBSD 9.1, Kubuntu 12.10
Posts: 3,078
Rep:
|
Quote:
Originally Posted by silentkill89
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:
- A function to listen to the port.
- A function to connect to the port.
- A function that writes first, reads second in a loop.
- 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
|
|
|
All times are GMT -5. The time now is 08:00 AM.
|
LinuxQuestions.org is looking for people interested in writing
Editorials, Articles, Reviews, and more. If you'd like to contribute
content, let us know.
|
Latest Threads
LQ News
|
|