hi Mates,
First of all thanks for this wonderful Programmers Community.
Recently i started to learn Socket Programming. i have some doubts, hope u ppl will clarif them.
i am trying to code a C program for sending a struct over TCP Socket in Linux!
The code is as follows: -
/*
-
** sravan_server.c - a stream socket (TCP) server Program
-
*/
-
#include <stdio.h>
-
#include<stdlib.h>
-
#include<unistd.h>
-
#include<errno.h>
-
#include<string.h>
-
#include<sys/types.h>
-
#include<sys/socket.h>
-
#include<netinet/in.h>
-
#include<arpa/inet.h>
-
#include<sys/wait.h>
-
#include<signal.h>
-
#include <time.h>
-
-
#define MYPORT 3490 // the port users will be connecting to
-
#define BACKLOG 10 // how many pending connections queue will hold
-
-
void sigchld_handler(int s)
-
{
-
while(wait(NULL) > 0);
-
}
-
-
// Structure to be sent over TCP Socket
-
struct RTUDATA
-
{
-
unsigned short tagid;
-
unsigned char flag;
-
float value;
-
time_t time_stamp;
-
};
-
-
int main(void)
-
{
-
int sockfd, new_fd; // listen on sock_fd, new connection on new_fd
-
struct sockaddr_in my_addr; // Sender's address information
-
struct sockaddr_in their_addr; // connector’s address information
-
int sin_size;
-
struct sigaction sa;
-
int yes=1;
-
-
//char *str="Hello 4rm_MTU!\n";
-
-
int n=0;
-
time_t ticks;
-
ticks = time(NULL);
-
struct RTUDATA rtu={htons(0x123), 'y', htons(33.3), ctime(&ticks)};
-
-
-
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
-
perror("socket");
-
exit(1);
-
}
-
if (setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&yes,sizeof(int)) == -1) {
-
perror("setsockopt");
-
exit(1);
-
}
-
my_addr.sin_family = AF_INET; //host byte order
-
my_addr.sin_port = htons(MYPORT); //short, network byte order
-
my_addr.sin_addr.s_addr = INADDR_ANY; //automatically fill with my IP
-
memset(&(my_addr.sin_zero),'\0', 8); //zero the rest of the struct
-
-
-
if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr))== -1)
-
{
-
perror("bind");
-
exit(1);
-
}
-
-
if (listen(sockfd, BACKLOG) == -1) {
-
perror("listen");
-
exit(1);
-
}
-
-
sa.sa_handler = sigchld_handler; // clear all dead processes
-
sigemptyset(&sa.sa_mask);
-
sa.sa_flags = SA_RESTART;
-
if (sigaction(SIGCHLD, &sa, NULL) == -1) {
-
perror("sigaction");
-
exit(1);
-
}
-
while(1) { // main accept() loop
-
sin_size = sizeof(struct sockaddr_in);
-
-
if ((new_fd = accept(sockfd, (struct sockaddr *)&their_addr,&sin_size)) == -1)
-
{
-
perror("accept");
-
continue;
-
}
-
-
printf("server: got connection from %s\n",inet_ntoa(their_addr.sin_addr));
-
-
printf("Data to be transferred is: %d\n",sizeof(rtu));
-
-
if (!fork()) { // this is the child process
-
close(sockfd); // child doesn’t need the listener
-
/*
-
if (send(new_fd, str, 15, 0) == -1)
-
perror("send");
-
*/
-
n=send(new_fd,(void *) &rtu ,sizeof(rtu), 0);
-
if ( n== -1)
-
perror("send");
-
else
-
printf("Total Data sent to %s is: %d \n",inet_ntoa(their_addr.sin_addr), n);
-
close(new_fd);
-
exit(0);
-
} // child process if condition close
-
close(new_fd); // parent doesn’t need this
-
} // while loop close
-
-
return 0;
-
}
My Question is How to receive this data i.e Client.c Program:
I tried some thing like below, but it is giving Segmentation Error. -
/*
-
** sravan_client.c - a stream socket (TCP) server Program
-
*/
-
#include<stdio.h>
-
#include<stdlib.h>
-
#include<unistd.h>
-
#include<errno.h>
-
#include<string.h>
-
#include<netdb.h>
-
#include<sys/types.h>
-
#include<netinet/in.h>
-
#include<sys/socket.h>
-
#define PORT 3490 // the port client will be connecting to
-
#define MAXDATASIZE 1024 // max number of bytes we can get at once
-
int main(int argc, char *argv[])
-
{
-
int sockfd, numbytes;
-
char buf[MAXDATASIZE];
-
-
struct hostent *he;
-
struct sockaddr_in their_addr; // connector’s (Sender's) address information
-
if (argc != 2) {
-
fprintf(stderr,"usage: client hostname\n");
-
exit(1);
-
}
-
if ((he=gethostbyname(argv[1])) == NULL) {
-
perror("gethostbyname");
-
exit(1);
-
}
-
// get the host info
-
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
-
perror("socket");
-
exit(1);
-
}
-
their_addr.sin_family = AF_INET; // host byte order
-
their_addr.sin_port = htons(PORT); // short, network byte order
-
their_addr.sin_addr = *((struct in_addr *)he->h_addr);
-
memset(&(their_addr.sin_zero),'\0', 8); // zero the rest of the struct
-
if (connect(sockfd, (struct sockaddr *)&their_addr,
-
sizeof(struct sockaddr)) == -1) {
-
perror("connect");
-
exit(1);
-
}
-
/*
-
if ((numbytes=recv(sockfd, buf, MAXDATASIZE-1, 0)) == -1) {
-
perror("recv");
-
exit(1);
-
}
-
*/
-
-
struct recvrtu
-
{
-
unsigned short tagid;
-
unsigned char flag;
-
float value;
-
time_t time_stamp;
-
}rtu;
-
-
//RECEIVING DATA
-
if ((numbytes=recv(sockfd, (struct recvrtu *)&rtu, sizeof(rtu), 0)) == -1) {
-
perror("recv");
-
exit(1);
-
}
-
-
printf("%d :: %c :: %d :: %s",ntohs(rtu.tagid),rtu.flag,ntohs(rtu.value),rtu.time_stamp);
-
-
-
close(sockfd);
-
return 0;
-
}
Please tell me the mistakes in the sending and receving programs!
4 33341 Banfa 9,065
Recognized Expert Moderator Expert
You shouldn't send structures, you can never be sure that the structure padding use by the sending machine will be the same as the structure padding used by the receiving machine.
Always split your structure down to its basic types including if required splitting down an sub-structures in the structure. Then serialise those values into a byte array using network byte ordering (which is big endian which is different to the byte ordering of intel machines).
Then you transmit the buffer.
Then when you receive you have to take account of nature of the TCP connection. A TCP connection is a byte stream, you do not send packets, you queue a buffer of data for transmission and the TCP stack sends the bytes in that buffer as it chooses. The bytes pop out the other end in the right order and with the correct value (if they pop out at all which they wont if, for example, the link is physically broken).
This means that you might send 2 structures each of 11 bytes but depending on timing and the transport medium the receiving end might receive 1 chunk of 22 bytes, 2 chunks of 11 bytes, 22 chunks of 1 byte or any other combination you can think of that adds up to 44. You receiving software has to be able to handle this and reconstitute the bytes back into your structure.
That means that unless you are only ever transmitting the 1 structure you will need some way to identify the nature and length of the data being received, say a byte to indicate what structure is being sent and a couple of bytes to give the length of data being sent for that structure.
is it possible to write the code for me plz?
it is urgent!
We can provide advice and a certain amount of theory and debugging but we cannot provide complete code solutions.
Banfa 9,065
Recognized Expert Moderator Expert
But if you look up "Beej's Guide to Network Programming" you will find a lot of useful examples.
Sign in to post your reply or Sign up for a free account.
Similar topics |
by: vardhansasi |
last post by:
I m a newbie to PHP and Mailing.I recently installed qmail on
my system.and hope its working fine. i need help in sending/
receiving/handling mails thru PHP.
thanx for tring to help.
|
by: Federico Caselli |
last post by:
Is it possible write a program to communicate with an external device via
bluetooth using visual basic .net (of course for windows xp sp1 or later)?
I tryed to read MSDN library about...
|
by: Sajsal |
last post by:
Hi all
I am developing a web app in which the client wants an email sending and
receiving functionality. Is it possible in C#. If yes where should I start.
If anyone could tell that how long...
|
by: WoodenSWord |
last post by:
Hello,
I am just wondering what is the best practice for sending/receiving XML
Files Through a web service method.
For example:
1) As a string
<WebMethod()> _
Public Function...
|
by: Martin Bürkle |
last post by:
Hi NG,
I have writen a programm using TCP sockets. After i get the connection
to another socket I cut the Ethernet cable. Then I send a message.
The program doesnt raise any exception. Can...
| |
by: MasterChief |
last post by:
Hy!
I am trying to write a programm which can send "user defined" messages over
the network to a client and receive the messages.
The Message is a class I have written and I am using recv() and...
|
by: gaddamreddy |
last post by:
Hai to all frns,
Reqirement 1:
1.I need to send a Request to one server through UDP socket.at that time i have to start a timer (setted to 2 sec) if i wont get the Response/ACK from that...
|
by: Jack |
last post by:
Hi, All,
is it possible to send a struct using the the send function. Here is
what I mean
typedef struct{
int ID;
char name;
}sampleStruct;
int main(){
|
by: Jack |
last post by:
Hi all,
I have a problem. I am writing a client server app in C. In my client
program, I have a simlple struct similiar to:
struct mySt{
int id;
char val;
struct mySt *next;
};
|
by: =?Utf-8?B?RGF2ZQ==?= |
last post by:
I need to send a file over a socket to a https address. Do I need to do
anything differently than specify the address with the https, and port 443?
For instance,
string m_server=...
|
by: Hystou |
last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can...
| |
by: Oralloy |
last post by:
Hello folks,
I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>".
The problem is that using the GNU compilers,...
|
by: jinu1996 |
last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven...
|
by: tracyyun |
last post by:
Dear forum friends,
With the development of smart home technology, a variety of wireless communication protocols have appeared on the market, such as Zigbee, Z-Wave, Wi-Fi, Bluetooth, etc. Each...
|
by: agi2029 |
last post by:
Let's talk about the concept of autonomous AI software engineers and no-code agents. These AIs are designed to manage the entire lifecycle of a software development project—planning, coding, testing,...
|
by: isladogs |
last post by:
The next Access Europe User Group meeting will be on Wednesday 1 May 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM).
In this session, we are pleased to welcome a new...
|
by: TSSRALBI |
last post by:
Hello
I'm a network technician in training and I need your help.
I am currently learning how to create and manage the different types of VPNs and I have a question about LAN-to-LAN VPNs.
The...
| |
by: adsilva |
last post by:
A Windows Forms form does not have the event Unload, like VB6. What one acts like?
|
by: 6302768590 |
last post by:
Hai team
i want code for transfer the data from one system to another through IP address by using C# our system has to for every 5mins then we have to update the data what the data is updated ...
| |