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-01-2011, 04:11 AM
|
#1
|
LQ Newbie
Registered: Aug 2011
Posts: 28
Rep:
|
[Question] tcp client and server connection problems
As the topic, I want to be clear on how to connect between pc which 1 pc is running as server and another as client.
Im still a newbie in Linux networking so forgive me if im wrong.
Below is my code:
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;
}
and client
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;
}
My code can only run in same pc, which means between terminal, but when running on another pc, it does not display anything but server side keep waiting for client respond and it stil not displaying anything after few hours later. I know i need to add some code like listen(), but I'm still not clear on how to do it. Thousand appreciate.
|
|
|
09-01-2011, 05:41 AM
|
#2
|
LQ Newbie
Registered: Aug 2011
Posts: 28
Original Poster
Rep:
|
can anyone please help me out? I'm urgently need to know the solution any guidance or example will do help me. Thanks
|
|
|
09-01-2011, 08:53 PM
|
#3
|
LQ Guru
Registered: Aug 2004
Location: Sydney
Distribution: Rocky 9.2
Posts: 18,391
|
Well, its been a while since I did sockets, & that was in Perl, but the principles are the same.
It looks to me (in client code) that the server_addr is derived from 'host = gethostbyname("127.0.0.1");' which is localhost interface. I think you need to specify actual remote server addr.
Have you read this http://beej.us/guide/bgnet/ ?
|
|
|
09-03-2011, 01:03 PM
|
#4
|
LQ Newbie
Registered: Aug 2011
Posts: 28
Original Poster
Rep:
|
do i have to buy the book? if so i rather search for some online tips
by the way chris, does that problem you mentioned above conflict with ip address too? because when i try to enter the ip, it still nothing happen, just like keep waiting and no response from client. Can you provide me some tips to that? Sorry im still in learning. Thank you
|
|
|
09-04-2011, 07:04 PM
|
#5
|
LQ Guru
Registered: Aug 2004
Location: Sydney
Distribution: Rocky 9.2
Posts: 18,391
|
If you looked at the link, you'd see
Quote:
HTML:
One section per page (read online)
All on one page (read online)
One section per page (tarball for download)
One section per page (zipfile for download)
All on one page (tarball for download)
All on one page (zipfile for download)
PDF:
US Letter, one sided
US Letter, two sided
A4, one sided
A4, two sided
|
You might also want to use the Report button to ask the Mods to move this to the Programming forum for quicker/better answers
|
|
|
09-04-2011, 08:27 PM
|
#6
|
Senior Member
Registered: Jun 2006
Location: Maryland
Distribution: Kubuntu, Fedora, RHEL
Posts: 1,541
|
The call to connect() has an error (see text in bold font):
Code:
if (connect(sock, (struct sockaddr *)&server_addr,
sizeof(struct sockaddr)) == -1)
Replace the bold-font text with "sockaddr_in".
A few other comments: gethostbyname() and bzero() are deprecated functions; gets() is unsafe to use. Use getaddrinfo(), memset(), and fgets() instead.
And here, you take the risk of a buffer overflow:
Code:
bytes_recieved = recv(connected,recv_data,1024,0);
recv_data[bytes_recieved] = '\0'; <--- if 1024 bytes are received, this will cause a
buffer overflow (index should be in range of 0-1023.
P.S. And it is 'i' before 'e', except when followed by 'c'; thus the correct spelling is "received".
|
|
|
09-04-2011, 08:27 PM
|
#7
|
Senior Member
Registered: Feb 2001
Location: Atlanta, GA
Distribution: Slackware
Posts: 1,821
Rep:
|
Same question in two separate threads. Follow the discussion in the other thread, this one is being closed.
http://www.linuxquestions.org/questi...5/#post4461226
|
|
|
All times are GMT -5. The time now is 07:24 PM.
|
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
|
|