Socket Programming


 
Thread Tools Search this Thread
Top Forums Programming Socket Programming
# 1  
Old 01-29-2007
Socket Programming

Hi ,
I'm facing the following problem in socket programming.

My structure is

struct {
int i;
char *str;
}samp;

I'm creating the pointer to this structure and assigning the value to the structure members and send via the socket to the another process.

The receiver process when trying to print the data of this struct members , it is printing only the int data and the str data is missing.

I not able to find out where the problem actually lies.

sample code:

samp s1;
s1 = malloc(sizeof(samp);
s1-> i = 100;
s1->str = "Data";

send(sockfd, s1, sizeof(samp), 0);
// I don't know whether the above statement of data send is correct.

In the receiver end.

samp s2;
s2 = malloc(sizeof(samp));

recv(recvfd, s2, sizeof(samp), 0);

Also please add some note about how to pass the "pointer to a structure" date across the process using sockets.

Thanks in Advance,
Arun Viswanath
# 2  
Old 01-29-2007
Pointers don't work that way. "str" is just an integer that points to memory local to a process, it won't be meaningful to whoever recieves it.

s1 has to be a pointer, since that is what malloc returns. But unless you need it to be persistent, you may not need to allocate it.

You can't declare a struct variable like "samp s1", you have to say "struct samp s1".

Try it like this:

Code:
struct {
  int i;
  char str[16];
}samp;

...

struct samp s1;

s1.i=1234;
strcpy(s1.str,"Data");

...

# 3  
Old 01-30-2007
Quote:
Originally Posted by Corona688
You can't declare a struct variable like "samp s1", you have to say "struct samp s1".
You could do a typedef and declare it as just 'samp s1'.

And about transferring the struct across sockets, there shouldn't be any problems there. Isn't it just a bunch of data? I thought you could transfer it just like you could transfer a string buffer.
# 4  
Old 01-30-2007
Quote:
Originally Posted by blowtorch
You could do a typedef and declare it as just 'samp s1'.

And about transferring the struct across sockets, there shouldn't be any problems there. Isn't it just a bunch of data? I thought you could transfer it just like you could transfer a string buffer.
Correct, the struct is just a bunch of data. Unfortunately the "char *str" element is just the memory address returned by malloc. It is not the data in that memory address.

So in the original code, what is being sent across the socket will be "meaningful" in that the receiver will understand it as a local memory address. Unfortunately, the data at that address in the receiver will not be the same as the data in that address in the originator.
# 5  
Old 01-30-2007
Quote:
Originally Posted by DaveG
Correct, the struct is just a bunch of data. Unfortunately the "char *str" element is just the memory address returned by malloc.
It's worse than that, the string is a pointer to a memory constant.
# 6  
Old 01-30-2007
Hi All,
Thanks for all your Info.
Event I tried changing my code , even now also i'm not getting my string printed.My code follows
Code:
my structure:
typedef struct
{
int i;
char *str; // things working fine when it is an array say char str[10]; But I want the pointer to void here.}samp;

server.c
    serv.sin_family = AF_INET;
    serv.sin_addr.s_addr = INADDR_ANY;
    serv.sin_port = htons(PORTNUM);

    mysocket = socket(AF_INET, SOCK_STREAM, 0);

    /* bind serv information to mysocket */
    if(bind(mysocket, (struct sockaddr *)&serv, sizeof(struct sockaddr)) < 0 )
     {
        printf("Cannot bind to port ");
     }

    /* start listening, allowing a queue of up to 1 pending connection */
    listen(mysocket, 1);
    while(1)
    {
        int consocket = accept(mysocket, (struct sockaddr *)&dest, &socksize);
        printf("Incoming connection from %s - sending welcome\n", inet_ntoa(dest.sin_addr));
        len = recv(consocket, (char *)s1, sizeof(samp), 0);
        printf("\n Rec data len : %d" , len);
        printf("\n Received Data : %d  %s\n", s1->i, s1->str);
        close(consocket);
    }
    close(mysocket);

client.c
    samp *s2;
    s2 = malloc(sizeof(samp));
    s2->i = 100;
    s2->str = malloc(10);
    strncpy(s2->str, "String", 10);
    mysocket = socket(AF_INET, SOCK_STREAM, 0);

    dest.sin_family = AF_INET;
    dest.sin_addr.s_addr = inet_addr("127.0.0.1");
    dest.sin_port = htons(PORTNUM);    
    if(connect(mysocket, (struct sockaddr *)&dest, sizeof(struct sockaddr)) < 0)
    {
       printf(" Connect Failed . No server Running \n");
    }

    send(mysocket, (char *)s2, sizeof(samp), 0);
    printf("Data send is : %d   %s \n", s2->i , s2->str);
         close(mysocket);

My server is listening for the data from client and prints the received data.
Please confirm the way I send and receive the data is correct

Last edited by blowtorch; 01-31-2007 at 12:22 AM..
# 7  
Old 01-30-2007
Quote:
Originally Posted by arunviswanath
Hi All,
Thanks for all your Info.
Event I tried changing my code , even now also i'm not getting my string printed.My code follows
Using code tags for code makes it far more readable, as it presents it in a fixed-size font, allows indenting, and other such things. Use it like {code} int variable; {/code} except with [ ] instead of { }. I'll do this before I make a real reply so I can see your code better.
Code:
typedef struct
{
int i;
char *str; // things working fine when it is an array say char str[10]; But I want the pointer to void here.}samp;

Code:
    serv.sin_family = AF_INET;
    serv.sin_addr.s_addr = INADDR_ANY;
    serv.sin_port = htons(PORTNUM);

    mysocket = socket(AF_INET, SOCK_STREAM, 0);

    /* bind serv information to mysocket */
    if(bind(mysocket, (struct sockaddr *)&serv, sizeof(struct sockaddr)) < 0 )
     {
        printf("Cannot bind to port ");
     }

    /* start listening, allowing a queue of up to 1 pending connection */
    listen(mysocket, 1);
    while(1)
    {
        int consocket = accept(mysocket, (struct sockaddr *)&dest, &socksize);
        printf("Incoming connection from %s - sending welcome\n", inet_ntoa(dest.sin_addr));
        len = recv(consocket, (char *)s1, sizeof(samp), 0);
        printf("\n Rec data len : %d" , len);
        printf("\n Received Data : %d  %s\n", s1->i, s1->str);
        close(consocket);
    }
    close(mysocket);

Code:
    samp *s2;
    s2 = malloc(sizeof(samp));
    s2->i = 100;
    s2->str = malloc(10);
    strncpy(s2->str, "String", 10);
    mysocket = socket(AF_INET, SOCK_STREAM, 0);

    dest.sin_family = AF_INET;
    dest.sin_addr.s_addr = inet_addr("127.0.0.1");
    dest.sin_port = htons(PORTNUM);    
    if(connect(mysocket, (struct sockaddr *)&dest, sizeof(struct sockaddr)) < 0)
    {
       printf(" Connect Failed . No server Running \n");
    }

    send(mysocket, (char *)s2, sizeof(samp), 0);
    printf("Data send is : %d   %s \n", s2->i , s2->str);
         close(mysocket);

Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Programming

socket programming

how to include socket.h in visual studio 2005.. (2 Replies)
Discussion started by: asd123
2 Replies

2. Programming

Socket programming

Hi everyone, I'm new to this forum. I'm working on new project for last few days and this forum already helped me on couple of occasions. I don't have any prior experience with network programming so I'll appreciate any advise given. I'm trying to do the following: 1. open user... (2 Replies)
Discussion started by: _thomas
2 Replies

3. UNIX for Dummies Questions & Answers

hi i need help with socket programming

in socket programming how can i : Create for example 3 blank files, namely: server, client, network •Server: act as servers/provider, will receive all requests from different client •Client: requesters •Network: middle-layer of communication between server & client any tips or... (6 Replies)
Discussion started by: kedah160
6 Replies

4. UNIX for Advanced & Expert Users

socket programming

can we send udp message to a destination ip address .. without having an ip address configured in our machine using recvfrom ? (2 Replies)
Discussion started by: Gopi Krishna P
2 Replies

5. Programming

help regarding socket programming

i m using sockets for setting up a connection between a server and a client. When the clients gets connected to the server, its ip is conveyed to the server through one of the predefined structures in c library... i save this ip address in an array....1st client's ip address goes to the zeroth... (1 Reply)
Discussion started by: abmxla007
1 Replies

6. IP Networking

socket programming

Hello Everyone Iam working on tcp/ip programming.with some time interval server has to send data.client has to close the connection and to open the connection between the time interval.this is the scenario when iam closing the connection in client side the connection terminates.how to... (1 Reply)
Discussion started by: sureshvaikuntam
1 Replies

7. IP Networking

socket programming

my system is a stand alone system... i want to try doing socket porgramming..ihave heard that this is usually done during testing... how can i do that....? (6 Replies)
Discussion started by: damn_bkb
6 Replies

8. Programming

Need Help Regarding Socket Programming

Can anyone plz me. I need a sample code for the following description. Its urgent. It is C/Socket program with the following descriptions: NAME coreadServer - Concurrent Readers Server. coreadClient - Concurrent Readers Client. SYNOPSIS coreadServer <OutputFile> coreadClient <n>... (1 Reply)
Discussion started by: priya.vmr
1 Replies

9. Programming

Socket Programming socket

Hello, I actually try to make client-server program. I'm using SCO OpenServer Release 5.0.0 and when I try to compile my code (by TELNET) I've got this error : I'm just using this simple code : and I get the same error if I use : If someone can help me, Thanks (2 Replies)
Discussion started by: soshell
2 Replies

10. Programming

Socket Programming

Dear Reader, Is there any way to check up socket status other than 'netstatus ' Thanks in advance, (1 Reply)
Discussion started by: joseph_shibu
1 Replies
Login or Register to Ask a Question