- From: Thomas Dreibholz <dreibh AT exp-math.uni-essen.de>
 
- To: "Sumathi.Elangovan" <Sumathi.Elangovan AT uk.thalesgroup.com>,	discussion AT sctp.de
 
- Subject: Re: [SCTP-Discussion] sendmsg() !!!!
 
- Date: Fri Nov 15 10:42:00 2002
 
- List-id: SCTP Discussions <discussion.sctp.de>
 
- Organization: University of Essen, Institute for Experimental Mathematics
 
 
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
Am Donnerstag, 14. November 2002 18:53 schrieb Sumathi.Elangovan:
>
 Hi!
>
 This is part of the program for the server-client association and data
>
 transfer for my application in 'C'. At first I use read() and write() for
>
 sending a set buffer of 1024 from the client to the server...but inorder to
>
 see whether the complete data has reached .....I need something lkke "EOR"
>
 flag to be set. Read() and write() doesnt enable to set flags. Is that
>
 right?
Yes, there is no other possibility to return flags.
>
 So I thought i will use sendmsg() and recvmsg() instead of read()
>
 amd write(). When I execute the below program....the association sets up
>
 fine but after the client connects...there seems to be a problem...in the
>
 sendmsg() where "segmentation fault occurs"...is it due to "msg" declared
>
 within the sendmsg()? Why does this error occur?
Where is the exact location of the error? Run "gdb <program name> <name of 
core file>" and enter "bt". This prints the stack trace. Then, enter "where 
full"; this prints the values of variables. Please send me these two results.
You do not initialize the msghdr structure in msg; you have to specify the 
buffer where the data to send is located (sendmsg()) or the data can be 
stored (recvmsg()). This has to be somethink like this:
struct iovec iov;
iov->iov_base = buf;
iov->iov_len = buflen;
msg->msg_iov = iov;
msg->msg_iovlen = 1;
In the client, you make a memset to 0 for msg. Although a sendmsg() does not 
make sense with this, no segmentation fault should occur here. In the server, 
you seem to have "msg" uninitialized. Here, "msg" may contain random junk and 
lead to a segmentation fault.
>
 Is my declaration of
>
 sendmsg wrong? Your help is much appreciated. Accept my apologies in
>
 sending the whole program....just thought it will explain you better in
>
 analysing where I am going wrong.  Thank you.
>
>
 #include.........
>
 #define.............
>
 extern int gnu_getopt_long( int argc,char *const *argv,const char
>
 *options,const struct option *long_options,int *opt_index ); struct msghdr
>
 msg[1];
>
 int recvMsgSize ;
>
 char echoBuffer[RCVMSGSIZE];
>
 /* SERVER */
>
 void SctpServer()
>
 {
>
       int servSock,clntSock;     /* socket descriptors for both server and
>
 client */ int n;
>
       struct sockaddr_in echoServAddr;     /* local address */
>
       struct sockaddr_in echoClntAddr;     /* client address */
>
       char buffer[BUFFER_SIZE];
>
       unsigned int clntLen;
>
>
       /* create socket for incoming connections */
>
       printf("Creating server socket......");
>
       /* the socket defined with the parameters AF_INET which indicates that
>
       *  the type of socket is an IPv4 socket and the next two arguments 
>
 specify
>
 the use of sctp */ if((servSock = ext_socket(AF_INET, SOCK_STREAM,
>
 IPPROTO_SCTP)) < 0) {
>
                       printf("socket() failed");
>
                       exit(1);
>
         }
>
       printf ("ext_socket()......created.\n\n");
>
>
       memset(&echoServAddr, 0 , sizeof(echoServAddr));
>
       /* Internet address family */
>
       echoServAddr.sin_family = AF_INET;
>
       /* any incoming interface */
>
       echoServAddr.sin_addr.s_addr = htonl(INADDR_ANY);
>
       /* local port - can specify the port say 7 - echo */
>
       echoServAddr.sin_port = htons(7);
>
>
       /* bind to the local address */
>
       printf("Binding address.......");
>
       if(ext_bind(servSock, (struct sockaddr *) &echoServAddr,
>
 sizeof(echoServAddr)) < 0) {
>
               printf("bind() failed");
>
               exit(1);
>
       }
>
       printf( " ext_bind()........bounded .\n\n");
>
>
       /* mark the socket it will listen to the incoming connection */
>
       printf("Waiting for incoming connection.........");
>
       if(ext_listen(servSock, MAXPENDING) < 0)
>
               {
>
                       printf("listen() failed");
>
                       exit(1);
>
         }
>
       printf( "ext_listen() .....listening........\n\n");
>
>
       clntLen = sizeof(echoClntAddr);
>
       if((clntSock = ext_accept(servSock, (struct sockaddr *) &echoClntAddr,
>
 &clntLen )) < 0) {
>
                       printf("accept() failed");
>
                       exit(1);
>
               }
>
       printf("ext_accept().....connected.\n\n");
>
       printf("Handling client %s\n\n", inet_ntoa(echoClntAddr.sin_addr));
>
>
       printf("reading buffer.\n\n");
>
       recvMsgSize = ext_recvmsg(clntSock,msg,0);
>
       if(recvMsgSize < 0)
>
               {
>
                       printf("recvmsg() failed");
>
               } else if(recvMsgSize == 0)
>
                       {
>
                               puts( "Connection shut down by client");
>
                               //break;
>
                       } else {
>
                                       echoBuffer[recvMsgSize] = '\0';
>
                                       printf("%s",echoBuffer);
>
                                       }
>
>
       //printf("\n\nClosing connection.....");
>
       //ext_close(clntSock);
>
       //printf("Connection closed....\n\n");
>
>
 }
>
>
 /* CLIENT */
>
>
 void SctpClient()
>
 {
>
       int clntSock,n,count;
>
   struct sockaddr_in echoClntAddr;
>
       struct sockaddr_in remote_addr;
>
       char buffer[BUFFER_SIZE];  /* physical block size on a peripheral 
>
 device
>
 where the buffer size is 1024 */ memset(msg,0,sizeof(*msg));
>
       printf("Creating client socket............");
>
       /* int ext_socket(int domain, int type, int protocol) */
>
       if ((clntSock =  ext_socket(AF_INET, SOCK_STREAM, IPPROTO_SCTP)) < 0)
>
               {
>
                       printf("socket() failed");
>
                       exit(1);
>
         }
>
       printf("ext_socket()........ created.\n\n");
>
>
   echoClntAddr.sin_family = AF_INET;
>
       echoClntAddr.sin_addr.s_addr = INADDR_ANY;
>
       echoClntAddr.sin_port = htons(7);
>
>
>
       printf("remote address...127.0.0.1.....");
>
       bzero(&remote_addr, sizeof(remote_addr));
>
       /* remote_addr.sin_len = sizeof(remote_addr) */
>
       remote_addr.sin_family = AF_INET;
>
       if(inet_aton("127.0.0.1", &remote_addr.sin_addr) != 1)
>
               {
>
                       printf("Inet_aton failed.\n\n");
>
                       exit(1);
>
     }
>
       remote_addr.sin_port = htons(7);
>
>
       /*      int ext_connect(int sockfd, const struct sockaddr* 
>
 serv_addr,socklen_t
>
 addrlen) */ if(ext_connect(clntSock, (const struct sockaddr *)
>
 &remote_addr, sizeof(remote_addr)) < 0) {
>
                       printf("connect() failed");
>
                       exit(1);
>
               }
>
       printf("ext_connect()...\n\n");
>
>
       printf("writing buffer..\n\n");
>
>
       if(count = ext_sendmsg( clntSock,msg, 0) < 0)
>
               {
>
                       printf("send() failed");
>
               }
>
       printf("count = %d\n",clntSock,count);
>
>
       /*if(ext_close(clntSock) < 0)
>
               {
>
                       printf("ext_close failed");
>
                       exit(1);
>
               }
>
       printf("ext_close by Client called..\n\n");   */
>
>
 }
>
>
>
 Regards
>
 Sumathi Elangovan
>
>
 Sumathi Elangovan
>
 Design Engineer
>
 Thales Research Limited
>
 Reading
>
 Tel: 0118 923 8272
>
 Email : 
>
 Sumathi.Elangovan AT uk.thalesgroup.com
>
>
>
>
>
 **********************************************************************
>
 This email and any files transmitted with it are intended solely for
>
 the use of the individual or entity to whom they are addressed and may
>
 not be divulged to any third party without the express permission of
>
 the originator.  Any views expressed in this message are those of the
>
 individual sender, except where the sender specifically states them to
>
 be the views of Thales Research & Technology (UK) Ltd.
>
 **********************************************************************
>
 _______________________________________________
>
 discussion mailing list
>
 discussion AT sctp.de
>
 http://www.sctp.de/mailman/listinfo/discussion
- -- 
=======================================================================
 Dipl.-Inform. Thomas Dreibholz
 University of Essen,                            Room ES210
 Inst. for Experimental Mathematics              Ellernstraße 29
 Computer Networking Technology Group            D-45326 Essen/Germany
- -----------------------------------------------------------------------
 E-Mail:     
dreibh AT exp-math.uni-essen.de
 Homepage:   
http://www.exp-math.uni-essen.de/~dreibh
=======================================================================
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.0.6 (GNU/Linux)
Comment: For info see 
http://www.gnupg.org
iD8DBQE91MBa32BbsHYPLWURAvxqAJ9I9RTE/nGaTAOycA30uqT8Im6G3gCffUnS
Y8XLcAZ5cgW7vRry82LsZAk=
=2KSo
-----END PGP SIGNATURE-----
Archive powered by MHonArc 2.6.19+.