473,473 Members | 2,028 Online
Bytes | Software Development & Data Engineering Community
Create Post

Home Posts Topics Members FAQ

Sending and Receiving a struct over TCP Socket in Linux

3 New Member
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:
Expand|Select|Wrap|Line Numbers
  1. /*
  2. ** sravan_server.c - a stream socket (TCP) server Program 
  3. */
  4. #include <stdio.h>
  5. #include<stdlib.h>
  6. #include<unistd.h>
  7. #include<errno.h>
  8. #include<string.h>
  9. #include<sys/types.h>
  10. #include<sys/socket.h>
  11. #include<netinet/in.h>
  12. #include<arpa/inet.h>
  13. #include<sys/wait.h>
  14. #include<signal.h>
  15. #include <time.h> 
  16.  
  17. #define MYPORT 3490    // the port users will be connecting to
  18. #define BACKLOG 10    // how many pending connections queue will hold
  19.  
  20. void sigchld_handler(int s)
  21. {
  22. while(wait(NULL) > 0);
  23. }
  24.  
  25. // Structure to be sent over TCP Socket
  26. struct RTUDATA
  27. {
  28.   unsigned short tagid;
  29.   unsigned char flag;
  30.   float value;
  31.   time_t time_stamp;
  32. };
  33.  
  34. int main(void)
  35. {
  36. int sockfd, new_fd;        // listen on sock_fd, new connection on new_fd
  37. struct sockaddr_in my_addr;    // Sender's address information
  38. struct sockaddr_in their_addr;    // connector’s address information
  39. int sin_size;
  40. struct sigaction sa;
  41. int yes=1;
  42.  
  43. //char *str="Hello 4rm_MTU!\n";
  44.  
  45. int n=0;
  46. time_t ticks;
  47. ticks = time(NULL);
  48. struct RTUDATA rtu={htons(0x123), 'y', htons(33.3), ctime(&ticks)};
  49.  
  50.  
  51. if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
  52. perror("socket");
  53. exit(1);
  54. }
  55. if (setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&yes,sizeof(int)) == -1) {
  56. perror("setsockopt");
  57. exit(1);
  58. }
  59. my_addr.sin_family = AF_INET;        //host byte order
  60. my_addr.sin_port = htons(MYPORT);    //short, network byte order
  61. my_addr.sin_addr.s_addr = INADDR_ANY;    //automatically fill with my IP
  62. memset(&(my_addr.sin_zero),'\0', 8);    //zero the rest of the struct
  63.  
  64.  
  65. if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr))== -1)
  66. {
  67. perror("bind");
  68. exit(1);
  69. }
  70.  
  71. if (listen(sockfd, BACKLOG) == -1) {
  72. perror("listen");
  73. exit(1);
  74. }
  75.  
  76. sa.sa_handler = sigchld_handler; // clear all dead processes
  77. sigemptyset(&sa.sa_mask);
  78. sa.sa_flags = SA_RESTART;
  79. if (sigaction(SIGCHLD, &sa, NULL) == -1) {
  80. perror("sigaction");
  81. exit(1);
  82. }
  83. while(1) {    // main accept() loop
  84. sin_size = sizeof(struct sockaddr_in);
  85.  
  86. if ((new_fd = accept(sockfd, (struct sockaddr *)&their_addr,&sin_size)) == -1) 
  87. {
  88. perror("accept");
  89. continue;
  90. }
  91.  
  92. printf("server: got connection from %s\n",inet_ntoa(their_addr.sin_addr));
  93.  
  94. printf("Data to be transferred is: %d\n",sizeof(rtu));
  95.  
  96. if (!fork()) {        // this is the child process
  97.   close(sockfd);    // child doesn’t need the listener
  98. /*
  99.   if (send(new_fd, str, 15, 0) == -1)
  100.     perror("send");
  101. */
  102. n=send(new_fd,(void *) &rtu ,sizeof(rtu), 0);
  103. if ( n== -1)
  104.     perror("send");
  105. else 
  106.     printf("Total Data sent to %s is: %d \n",inet_ntoa(their_addr.sin_addr), n);
  107.   close(new_fd);
  108.   exit(0);
  109. }    // child process if condition close 
  110. close(new_fd);    // parent doesn’t need this
  111. }    // while loop close
  112.  
  113. return 0;
  114. }
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.
Expand|Select|Wrap|Line Numbers
  1. /*
  2. ** sravan_client.c - a stream socket (TCP) server Program
  3. */
  4. #include<stdio.h>
  5. #include<stdlib.h>
  6. #include<unistd.h>
  7. #include<errno.h>
  8. #include<string.h>
  9. #include<netdb.h>
  10. #include<sys/types.h>
  11. #include<netinet/in.h>
  12. #include<sys/socket.h>
  13. #define PORT 3490 // the port client will be connecting to
  14. #define MAXDATASIZE 1024 // max number of bytes we can get at once
  15. int main(int argc, char *argv[])
  16. {
  17. int sockfd, numbytes;
  18. char buf[MAXDATASIZE];
  19.  
  20. struct hostent *he;
  21. struct sockaddr_in their_addr; // connector’s (Sender's) address information
  22. if (argc != 2) {
  23. fprintf(stderr,"usage: client hostname\n");
  24. exit(1);
  25. }
  26. if ((he=gethostbyname(argv[1])) == NULL) {
  27. perror("gethostbyname");
  28. exit(1);
  29. }
  30. // get the host info
  31. if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
  32. perror("socket");
  33. exit(1);
  34. }
  35. their_addr.sin_family = AF_INET;    // host byte order
  36. their_addr.sin_port = htons(PORT);    // short, network byte order
  37. their_addr.sin_addr = *((struct in_addr *)he->h_addr);
  38. memset(&(their_addr.sin_zero),'\0', 8);    // zero the rest of the struct
  39. if (connect(sockfd, (struct sockaddr *)&their_addr,
  40. sizeof(struct sockaddr)) == -1) {
  41. perror("connect");
  42. exit(1);
  43. }
  44. /*
  45. if ((numbytes=recv(sockfd, buf, MAXDATASIZE-1, 0)) == -1) {
  46. perror("recv");
  47. exit(1);
  48. }
  49. */
  50.  
  51. struct recvrtu
  52. {
  53.   unsigned short tagid;
  54.   unsigned char flag;
  55.   float value;
  56.   time_t time_stamp;
  57. }rtu;
  58.  
  59. //RECEIVING DATA
  60. if ((numbytes=recv(sockfd, (struct recvrtu *)&rtu, sizeof(rtu), 0)) == -1) {
  61. perror("recv");
  62. exit(1);
  63. }
  64.  
  65. printf("%d :: %c :: %d :: %s",ntohs(rtu.tagid),rtu.flag,ntohs(rtu.value),rtu.time_stamp);
  66.  
  67.  
  68. close(sockfd);
  69. return 0;
  70. }
Please tell me the mistakes in the sending and receving programs!
Apr 4 '12 #1
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.
Apr 4 '12 #2
shravansofts
3 New Member
is it possible to write the code for me plz?
it is urgent!
Apr 4 '12 #3
weaknessforcats
9,208 Recognized Expert Moderator Expert
We can provide advice and a certain amount of theory and debugging but we cannot provide complete code solutions.
Apr 4 '12 #4
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.
Apr 4 '12 #5

Sign in to post your reply or Sign up for a free account.

Similar topics

1
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.
2
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...
1
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...
3
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...
10
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...
5
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...
4
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...
6
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(){
2
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; };
4
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=...
0
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...
0
Oralloy
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,...
0
jinu1996
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...
0
tracyyun
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...
0
agi2029
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,...
1
isladogs
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...
0
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...
0
by: adsilva | last post by:
A Windows Forms form does not have the event Unload, like VB6. What one acts like?
0
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 ...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.