gnustep-dev
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Problem in Socket Programing in C


From: mail
Subject: Re: Problem in Socket Programing in C
Date: Fri, 03 Jun 2011 10:27:00 -0600
User-agent: RoundCube Webmail/0.3.1

I hadn't even noticed you'd cc'd the GNUStep developers' list on this
strange email.

So, let's get this straight.... you take my UNIX code at
http://www.paulgriffiths.net/program/c/srcs/echoservsrc.html, add a couple
of winsock.h #include references, remove my copyright notices, make no
other changes, and then send it back to me saying "I am trying to create"
and "this is my code" and asking me why it doesn't work under Windows? 

You're crazy and you have no shame.

Cheers
Paul

On Fri, 3 Jun 2011 14:34:48 +0530, Parag Deshpande
<address@hidden> wrote:
> Hi
> I am trying to create simple tcp client server architecture in which
server
> accepts client request and echoes the same line written by client.
> 
> this is my code
> 
> /*HELPER.H
>   ========
> 
> 
>   Interface to socket helper functions.
> 
>   Many of these functions are adapted from, inspired by, or
>   otherwise shamelessly plagiarised from "Unix Network
>   Programming", W Richard Stevens (Prentice Hall).
> 
> */
> 
> 
> #ifndef PG_SOCK_HELP
> #define PG_SOCK_HELP
> 
> 
> #include <unistd.h>             /*  for ssize_t data type  */
> 
> #define LISTENQ        (1024)   /*  Backlog for listen()   */
> 
> 
> /*  Function declarations  */
> 
> ssize_t Readline(int fd, void *vptr, size_t maxlen);
> ssize_t Writeline(int fc, const void *vptr, size_t maxlen);
> 
> 
> #endif  /*  PG_SOCK_HELP  */
> 
> 
> 
> 
> /*HELPER.C
>   ========
> 
> 
>   Implementation of sockets helper functions.
> 
>   Many of these functions are adapted from, inspired by, or
>   otherwise shamelessly plagiarised from "Unix Network
>   Programming", W Richard Stevens (Prentice Hall).
> 
> */
> 
> #include "helper.h"
> #include <winsock.h>
> #include <unistd.h>
> #include <errno.h>
> #include <windows.h>
> 
> /*  Read a line from a socket  */
> 
> ssize_t Readline(int sockd, void *vptr, size_t maxlen) {
>     ssize_t n, rc;
>     char    c, *buffer;
> 
>     buffer = vptr;
> 
>     for ( n = 1; n < maxlen; n++ ) {
> 
>     if ( (rc = read(sockd, &c, 1)) == 1 ) {
>         *buffer++ = c;
>         if ( c == '\n' )
>         break;
>     }
>     else if ( rc == 0 ) {
>         if ( n == 1 )
>         return 0;
>         else
>         break;
>     }
>     else {
>         if ( errno == EINTR )
>         continue;
>         return -1;
>     }
>     }
> 
>     *buffer = 0;
>     return n;
> }
> 
> 
> /*  Write a line to a socket  */
> 
> ssize_t Writeline(int sockd, const void *vptr, size_t n) {
>     size_t      nleft;
>     ssize_t     nwritten;
>     const char *buffer;
> 
>     buffer = vptr;
>     nleft  = n;
> 
>     while ( nleft > 0 ) {
>     if ( (nwritten = write(sockd, buffer, nleft)) <= 0 ) {
>         if ( errno == EINTR )
>         nwritten = 0;
>         else
>         return -1;
>     }
>     nleft  -= nwritten;
>     buffer += nwritten;
>     }
> 
>     return n;
> }
> 
> 
> 
> /*ECHOSERV.C
>   ==========
> 
>   Simple TCP/IP echo server.
> 
> */
> 
> 
> #include <winsock2.h>       /*  socket definitions        */
> #include <sys/types.h>        /*  socket types              */
> #include <windows.h>        /*  inet (3) funtions         */
> 
> 
> #include "helper.h"           /*  our own helper functions  */
> 
> #include <stdlib.h>
> #include <stdio.h>
> 
> 
> /*  Global constants  */
> 
> #define ECHO_PORT          (2002)
> #define MAX_LINE           (1000)
> 
> 
> int main(int argc, char *argv[]) {
>     int       list_s;                /*  listening socket          */
>     int       conn_s;                /*  connection socket         */
>     short int port;                  /*  port number               */
>     struct    sockaddr_in servaddr;  /*  socket address structure  */
>     char      buffer[MAX_LINE];      /*  character buffer          */
>     char     *endptr;                /*  for strtol()              */
> 
> 
>     /*  Get port number from the command line, and
>         set to default port if no arguments were supplied  */
> 
>     if ( argc == 2 ) {
>     port = strtol(argv[1], &endptr, 0);
>     if ( *endptr ) {
>         fprintf(stderr, "ECHOSERV: Invalid port number.\n");
>         exit(EXIT_FAILURE);
>     }
>     }
>     else if ( argc < 2 ) {
>     port = ECHO_PORT;
>     }
>     else {
>     fprintf(stderr, "ECHOSERV: Invalid arguments.\n");
>     exit(EXIT_FAILURE);
>     }
> 
> 
>     /*  Create the listening socket  */
> 
>     if ( (list_s = socket(AF_INET, SOCK_STREAM, 0)) < 0 ) {
>     fprintf(stderr, "ECHOSERV: Error creating listening socket.\n");
>     exit(EXIT_FAILURE);
>     }
> 
> 
>     /*  Set all bytes in socket address structure to
>         zero, and fill in the relevant data members   */
> 
>     memset(&servaddr, 0, sizeof(servaddr));
>     servaddr.sin_family      = AF_INET;
>     servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
>     servaddr.sin_port        = htons(port);
> 
> 
>     /*  Bind our socket addresss to the
>     listening socket, and call listen()  */
> 
>     if ( bind(list_s, (struct sockaddr *) &servaddr, sizeof(servaddr)) <
0
>     )
> {
>     fprintf(stderr, "ECHOSERV: Error calling bind()\n");
>     exit(EXIT_FAILURE);
>     }
> 
>     if ( listen(list_s, LISTENQ) < 0 ) {
>     fprintf(stderr, "ECHOSERV: Error calling listen()\n");
>     exit(EXIT_FAILURE);
>     }
> 
> 
>     /*  Enter an infinite loop to respond
>         to client requests and echo input  */
> 
>     while ( 1 ) {
> 
>     /*  Wait for a connection, then accept() it  */
> 
>     if ( (conn_s = accept(list_s, NULL, NULL) ) < 0 ) {
>         fprintf(stderr, "ECHOSERV: Error calling accept()\n");
>         exit(EXIT_FAILURE);
>     }
> 
> 
>     /*  Retrieve an input line from the connected socket
>         then simply write it back to the same socket.     */
> 
>     Readline(conn_s, buffer, MAX_LINE-1);
>     Writeline(conn_s, buffer, strlen(buffer));
> 
> 
>     /*  Close the connected socket  */
> 
>     if ( close(conn_s) < 0 ) {
>         fprintf(stderr, "ECHOSERV: Error calling close()\n");
>         exit(EXIT_FAILURE);
>     }
>     }
> }
> 
> 
> My problem is i am getting an error of undefined  reference to
> address@hidden
> i m running GCC on windows so if u have solution for this do write to
me.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]