Note that there are some explanatory texts on larger screens.

plurals
  1. POAccessing buffer using read() in sockets
    text
    copied!<p>In my socket code I have the following structure:</p> <p>Server:</p> <pre><code> #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;string.h&gt; #include &lt;sys/types.h&gt; #include &lt;sys/socket.h&gt; #include &lt;netinet/in.h&gt; #define MAXPROFILES 2 int main(int argc, char *argv[]) { int sockfd, newsockfd, portno, clilen; struct sockaddr_in serv_addr, cli_addr; unsigned char buf[1024]; char* pointer = buf; struct profile_t { unsigned char length; unsigned char type; unsigned char *data; }; typedef struct profile_datagram_t { unsigned char src[4]; unsigned char dst[4]; unsigned char ver; unsigned char n; struct profile_t profiles[MAXPROFILES]; } header; header outObj; int j =0; int i =0; if (argc &lt; 2) { fprintf(stderr,"usage: %s port_number1",argv[0]); exit(1); } sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd &lt; 0) error("ERROR DETECTED !!! Problem in opening socket"); bzero((char *) &amp;serv_addr, sizeof(serv_addr)); portno = atoi(argv[1]); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); serv_addr.sin_port = htons(portno); if (bind(sockfd, (struct sockaddr *) &amp;serv_addr, sizeof(serv_addr)) &lt; 0) error("ERROR DETECTED !!! There was a problem in binding"); listen(sockfd, 10); clilen = sizeof(cli_addr); printf("Server listening on port number %d...\n", serv_addr.sin_port); newsockfd = accept(sockfd,(struct sockaddr *) &amp;cli_addr, &amp;clilen); if (newsockfd &lt; 0) error("ERROR DETECTED !!! the connection request was not accepted"); int rc = read(newsockfd,&amp;pointer,100); if(rc &lt; 0){ printf("error"); } else { printf("success %d",rc); } for(int i=0;i&lt;29;i++){ printf(pointer); printf(buf); } return 0; </code></pre> <p>}</p> <p>Client:</p> <pre><code> int main(int argc, char *argv[]) { int sockfd, portno, n; struct sockaddr_in serv_addr; struct hostent *server; unsigned char buf[1024]; unsigned int srcAddress = 2193598184; unsigned int destAddress = 2193598182; struct profile_t { unsigned char length; unsigned char type; unsigned char *data; }; typedef struct profile_datagram_t { unsigned char src[4]; unsigned char dst[4]; unsigned char ver; unsigned char n; struct profile_t profiles[MAXPROFILES]; } header; header outObj; int j =0; int i =0; // for loop for doing the malloc so that we can allocate memory to all profiles for(i=0;i&lt;MAXPROFILES;i++){ outObj.profiles[i].data = malloc(5); } for(i=0;i&lt;4;i++){ outObj.src[i] = (srcAddress &gt;&gt; (i*8)) &amp; 0xFF; outObj.dst[i] = (destAddress &gt;&gt; (i*8)) &amp; 0xFF; } outObj.ver = 1; outObj.n = 2; memcpy(buf,&amp;outObj.src,4); memcpy(buf+4,&amp;outObj.dst,4); memcpy(buf+8,&amp;outObj.ver,1); memcpy(buf+9,&amp;outObj.n,2); outObj.profiles[0].length = 5; outObj.profiles[0].type = 1; outObj.profiles[1].length = 5; outObj.profiles[1].type = 2; for(i=0;i&lt;MAXPROFILES;i++){ for(j=0;j&lt;5;j++){ outObj.profiles[i].data[j] = j+1; } } int k = 11; for(i=0;i&lt;MAXPROFILES;i++){ memcpy(buf+k,&amp;outObj.profiles[0].length,1); memcpy(buf+k+1,&amp;outObj.profiles[0].type,1); memcpy(buf+k+2,outObj.profiles[0].data,5); k +=7; } if (argc &lt; 3) { fprintf(stderr,"usage: %s hostname port\n", argv[0]); exit(0); } portno = atoi(argv[2]); //Convert ASCII to integer sockfd = socket(AF_INET, SOCK_STREAM, 0); // socket file descriptor if (sockfd &lt; 0) error("ERROR DETECTED !!! Problem in opening socket\n"); server = gethostbyname(argv[1]); if (server == NULL) { fprintf(stderr,"ERROR DETECTED !!!, no such server found \n"); exit(0); } bzero((char *) &amp;serv_addr, sizeof(serv_addr)); //clear the memory for server address serv_addr.sin_family = AF_INET; bcopy((char *)server-&gt;h_addr, (char *)&amp;serv_addr.sin_addr.s_addr, server-&gt;h_length); serv_addr.sin_port = htons(portno); printf("Client 1 trying to connect with server host %s on port %d\n", argv[1], portno); if (connect(sockfd,(struct sockaddr *)&amp;serv_addr,sizeof(serv_addr)) &lt; 0) error("ERROR in connection"); printf("SUCCESS !!! Connection established \n"); if (write(sockfd, buf, k) &lt; 0) { error("Write error has occured "); } return 0; } </code></pre> <p>Now from the client side I do a memcpy to my unsigned char buf and send the data. On the recv side how to access the values inside my "buf". I tried the "*" operator, but i get a warning</p> <p>arning: passing argument 1 of âprintfâ makes pointer from integer without a cast</p> <p>I want to basically access the values inside buffer, as I know the size i should be able to repopulate my packet back. I know that this is a "C" question and not exactly "socket related". Any help would be really helpful.</p>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload