[Question] tcp client and server connection problems
ProgrammingThis 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.
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.
[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;
}
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.
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/ ?
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
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
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".
LinuxQuestions.org is looking for people interested in writing
Editorials, Articles, Reviews, and more. If you'd like to contribute
content, let us know.