Sponsored Content
Operating Systems HP-UX fd passing between Independent processes using unix domain sockets Post 66169 by Debasisb2002 on Friday 11th of March 2005 06:51:02 AM
Old 03-11-2005
fd passing between Independent processes using unix domain sockets

Hi,
I am having some error handling issues with and fd passed between Independent processes using unix domain sockets (On HPUX).

Here is the scnerio
=================

Step 1: TPC/Client (connect()) ---Connects to ------TCP/Server(Gateway) (server gets fd)


Step 2: TPC/Server(Gateway) passes the fd to another process (Logic Server) to handle the request unsing unix domain sockets (sendmsg).


Step 3: Now the Logic Server (which got the fd) directly communicated with the clinet in TPC and does send()/recv() of the fd



• The TCP/server behaves as a gateway server and accepts the connection from the client.
• The fd is passed to the Logic Server process using UNIX domain sockets.
• The Logic Server process using this fd does send() and recv() and communicates with the client.
• The client now communicates directly with the server using TCP and this handover of the live connection is transparent to the client.
• The client send() request to the server and makes a blocking recv() for the response.

All this works fine.


Error Description
=============
But, if due to some reason if the Logic Server dumps without sending any response to the client the client keeps hanging on the blocking recv().

But, as the connection between the server and client is using TPC, on the exit of the server the recv() in the client should return with error. This is not happening.

Instead if the TCP/server (which the client connected initially) is killed the recv() in the client side return with the error.


So, although the fd is passed to the server, the “association” of the clinet remains with the TCP/Server.



Code Fragment

Following code is used to pass the fd from the TCP/SERVER to the Server:

int snd_fd(int sockfd, void *ptr, size_t nbytes, int sendfd)
{
struct iovec iov[1];
struct msghdr msg;
int retval = 0;

#ifdef DEBUG
printf (" snd_fd :: cmd = %d \n",*((int *)ptr));
printf (" snd_fd :: sockfd =%d \n",sockfd);
printf (" snd_fd :: nbytes =%d \n",nbytes);
printf (" snd_fd :: sendfd =%d \n",sendfd);
#endif

iov[0].iov_base = ptr;
iov[0].iov_len = nbytes;
msg.msg_iov = iov;
msg.msg_iovlen = 1;
msg.msg_name = (caddr_t) 0;
msg.msg_namelen = 0;
if(*((int *)ptr) == GETTOWORK_CMD)
{
msg.msg_accrights = (caddr_t) &sendfd;
msg.msg_accrightslen = sizeof(int);
}
#ifdef DEBUG
printf(" snd_fd :: Sending Msg\n");
#endif

retval = sendmsg (sockfd, &msg, 0);
#ifdef DEBUG
if(retval >= 0)
printf("inside snd_fd, sendmsg success");
else
perror("sendmsg failed:");
#endif

return (retval);

}
 

10 More Discussions You Might Find Interesting

1. UNIX for Dummies Questions & Answers

Association b/w sockets & processes

Hi, Is there any way i can know the association between sockets and the processes which created them. :confused: (5 Replies)
Discussion started by: soorajmu
5 Replies

2. IP Networking

Unix Domain

hello, how can we create a domain in unix operating systems. By domain i mean which is used to maintain remote user logins and etc. cheers (1 Reply)
Discussion started by: vibhory2j
1 Replies

3. UNIX for Dummies Questions & Answers

UNIX in MS Win2003 Domain

Hi, Can I make a UNIX or LINUX machine a member of MS Active Directory 2003? How? Regards Leo (4 Replies)
Discussion started by: Teamplay
4 Replies

4. UNIX for Dummies Questions & Answers

Adding a Unix machine to the domain

Hiya, what is the exact command to add a Unix machine to the existing domain? Is this command different for Linux/HP-Ux? thanks (3 Replies)
Discussion started by: Wize
3 Replies

5. UNIX for Advanced & Expert Users

UNIX Message Queues vs. Sockets

If I use sockets for IPC, and can easily distribute my applications. UNIX Message Queues are local to the processor. As I understand it, Message Queues still incur system call overhead, just like socket calls. What advantage does a UNIX Message Queue provide versus a TCP or UDP Socket,... (2 Replies)
Discussion started by: zen29sky
2 Replies

6. Shell Programming and Scripting

Position independent Parameter passing

Hi all, When parameters are passed to the shell script, they are dereferenced by their position. For example, I call myTest.sh and pass two parameters param1 and param2 as following: ./myTest.sh param1 param2 In the script, myTest.sh, I refer to first parameter (param1 ) as $1 and second... (1 Reply)
Discussion started by: sonaluphale
1 Replies

7. What is on Your Mind?

When Unix will have a singe version, platform independent OS

I wonder when UNIX will be a OS, will have a single version. (1 Reply)
Discussion started by: abhishek0216
1 Replies

8. UNIX for Advanced & Expert Users

UNIX domain sockets vs FIFOs

Is there a performance advantage of one of these over the other? Obviously, it makes no sense to use normal TCP sockets or UDP sockets w/ the overhead they carry. But what about UNIX domain sockets vs FIFOs? I'd think they'd be very similar, in terms of performance and in terms of how they're... (2 Replies)
Discussion started by: mgessner
2 Replies

9. Shell Programming and Scripting

Finding the age of a unix process, killing old processes, killing zombie processes

I had issues with processes locking up. This script checks for processes and kills them if they are older than a certain time. Its uses some functions you'll need to define or remove, like slog() which I use for logging, and is_running() which checks if this script is already running so you can... (0 Replies)
Discussion started by: sukerman
0 Replies

10. UNIX for Dummies Questions & Answers

what is the advantage of unix sockets?

Hi, i understood that there are several type of sockets: TCP, UDP & Unix. i wondered, what is the performance advantages of unix socket of the other types? isn't it equal to use UDP with localhost as destination over unix socket? Thanks in advance, Sariel (1 Reply)
Discussion started by: sarielz
1 Replies
SENDMMSG(2)						     Linux Programmer's Manual						       SENDMMSG(2)

NAME
sendmmsg - send multiple messages on a socket SYNOPSIS
#define _GNU_SOURCE /* See feature_test_macros(7) */ #include <sys/socket.h> int sendmmsg(int sockfd, struct mmsghdr *msgvec, unsigned int vlen, int flags); DESCRIPTION
The sendmmsg() system call is an extension of sendmsg(2) that allows the caller to transmit multiple messages on a socket using a single system call. (This has performance benefits for some applications.) The sockfd argument is the file descriptor of the socket on which data is to be transmitted. The msgvec argument is a pointer to an array of mmsghdr structures. The size of this array is specified in vlen. The mmsghdr structure is defined in <sys/socket.h> as: struct mmsghdr { struct msghdr msg_hdr; /* Message header */ unsigned int msg_len; /* Number of bytes transmitted */ }; The msg_hdr field is a msghdr structure, as described in sendmsg(2). The msg_len field is used to return the number of bytes sent from the message in msg_hdr (i.e., the same as the return value from a single sendmsg(2) call). The flags argument contains flags ORed together. The flags are the same as for sendmsg(2). A blocking sendmmsg() call blocks until vlen messages have been sent. A nonblocking call sends as many messages as possible (up to the limit specified by vlen) and returns immediately. On return from sendmmsg(), the msg_len fields of successive elements of msgvec are updated to contain the number of bytes transmitted from the corresponding msg_hdr. The return value of the call indicates the number of elements of msgvec that have been updated. RETURN VALUE
On success, sendmmsg() returns the number of messages sent from msgvec; if this is less than vlen, the caller can retry with a further sendmmsg() call to send the remaining messages. On error, -1 is returned, and errno is set to indicate the error. ERRORS
Errors are as for sendmsg(2). An error is returned only if no datagrams could be sent. See also BUGS. VERSIONS
The sendmmsg() system call was added in Linux 3.0. Support in glibc was added in version 2.14. CONFORMING TO
sendmmsg() is Linux-specific. NOTES
The value specified in vlen is capped to UIO_MAXIOV(1024). BUGS
If an error occurs after at least one message has been sent, the call succeeds, and returns the number of messages sent. The error code is lost. The caller can retry the transmission, starting at the first failed message, but there is no guarantee that, if an error is returned, it will be the same as the one that was lost on the previous call. EXAMPLE
The example below uses sendmmsg() to send onetwo and three in two distinct UDP datagrams using one system call. The contents of the first datagram originates from a pair of buffers. #define _GNU_SOURCE #include <netinet/ip.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> int main(void) { int sockfd; struct sockaddr_in addr; struct mmsghdr msg[2]; struct iovec msg1[2], msg2; int retval; sockfd = socket(AF_INET, SOCK_DGRAM, 0); if (sockfd == -1) { perror("socket()"); exit(EXIT_FAILURE); } addr.sin_family = AF_INET; addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK); addr.sin_port = htons(1234); if (connect(sockfd, (struct sockaddr *) &addr, sizeof(addr)) == -1) { perror("connect()"); exit(EXIT_FAILURE); } memset(msg1, 0, sizeof(msg1)); msg1[0].iov_base = "one"; msg1[0].iov_len = 3; msg1[1].iov_base = "two"; msg1[1].iov_len = 3; memset(&msg2, 0, sizeof(msg2)); msg2.iov_base = "three"; msg2.iov_len = 5; memset(msg, 0, sizeof(msg)); msg[0].msg_hdr.msg_iov = msg1; msg[0].msg_hdr.msg_iovlen = 2; msg[1].msg_hdr.msg_iov = &msg2; msg[1].msg_hdr.msg_iovlen = 1; retval = sendmmsg(sockfd, msg, 2, 0); if (retval == -1) perror("sendmmsg()"); else printf("%d messages sent ", retval); exit(0); } SEE ALSO
recvmmsg(2), sendmsg(2), socket(2), socket(7) COLOPHON
This page is part of release 4.15 of the Linux man-pages project. A description of the project, information about reporting bugs, and the latest version of this page, can be found at https://www.kernel.org/doc/man-pages/. Linux 2018-02-02 SENDMMSG(2)
All times are GMT -4. The time now is 03:22 AM.
Unix & Linux Forums Content Copyright 1993-2022. All Rights Reserved.
Privacy Policy