Problems with sockets: need help
lia!nieh at cs.utexas.edu
lia!nieh at cs.utexas.edu
Wed Jul 18 05:53:38 AEST 1990
I am having problem with the TCP/UDP facilities. What I want to do is to
have a server process permanently listen to two ports one created as a UPD
port and the other as a TCP port. The server will receive UPD and/or TCP
packets asynchronously. The following program is written in Sun/C++ on
SunOs-4.0.3.
The symptom are:
1. If several processes send UPD packets to the server, it works
2. If several processes send TCP packets to the server, it works
3. If several processes send UPD packets first then
other processes send TCP packets, the sever will not receive
the TCP packets.
4. If several processes send TCP packets first then
other processes send UDP packets, the sever will not receive
the UDP packets.
I need your help. If you can figure out the problem from the following
code please e-mail me your solution. If you need to see the rest of the
code please let me know I can send it to you.
Ko-Haw Nieh
// This is a server
// class TcpChannel and UdpChannel are C++ classes build on top of socket
#include "tcp_udp_channel.h"
#include <osfcn.h>
main(int ii,char **argv){
TcpChannel tconnection,*tx;
UdpChannel uconnection;
int tfd,ufd;
fd_set fdset,xxfdset;
char buf[1000];
int size;
int width;
int xx;
// argv[1] contains the host name
uconnection.CreateService(argv[1],3503); // listen to this udp channel
tconnection.CreateService(argv[1],3502); // listen to this tcp channel
ufd = uconnection.Descriptor(); // get the udp descriptor
tfd = tconnection.Descriptor(); // get the tcp descriptor
FD_ZERO(&fdset);
FD_SET(ufd,&fdset);
FD_SET(tfd,&fdset);
width = getdtablesize();
for(int j=0;;j++){ // main loop
buf[0] = '\0';
if(select(width,&fdset,0,0,NULL) < 0){ // multiplex on udp and tcp channel
perror("select error\n");
exit(1);
}
if(FD_ISSET(ufd,&fdset)){ // a udp packet is ready
size = read(ufd,buf,500);
buf[size] = '\0';
printf("UDP: %d:read %d characters, content = %s\n",j,size,buf);
printf("------------------------\n");
}
else{ // a tcp packet is ready
if(FD_ISSET(tfd,&fdset)){
tx = tconnection.AcceptClient(); // returns a TcpChannel
xx = tx->Descriptor(); // get the descriptor of the Channel
FD_ZERO(&xxfdset);
FD_SET(xx,&xxfdset);
if(select(width,&xxfdset,&xxfdset,0,NULL) < 0){
perror("select error\n");
exit(1);
}
size = read(xx,buf,500);
buf[size] = '\0';
printf("TCP: %d:read %d characters, content = %s\n",j,size,buf);
printf("------------------------\n");
delete tx; // delete (close) the TcpChannel as well as its descriptor
}
else
printf("a wrong descriptor is ready\n");
}
}
}
-----------tcp_udp_channel.h------------------------
#ifndef tcp_udp_Channel_h
#define tcp_udp_Channel_h
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <sys/un.h>
#include <sys/ioctl.h>
#include <errno.h>
#include <fcntl.h>
#include <string.h>
#include <libc.h>
#include <osfcn.h>
typedef unsigned boolean;
//static const boolean false = 0;
//static const boolean true = 1;
class TcpChannel {
public:
TcpChannel();
~TcpChannel();
void CreateService(char* host, int port); // called by server
boolean OpenService(char* host, int port); // called by client
TcpChannel* AcceptClient();
int Read(void*, int);
int Write(void*, int);
int Descriptor () { return fd; }
void Close();
protected:
int fd; // file descriptor for read/write to the TcpChannel
int domain; // UNIX domain or Internet domain
char* name; // service name -- server site
// host name -- client site
int port; // Internet prot number, not used for UNIX domain
};
class UdpChannel {
public:
UdpChannel();
~UdpChannel();
void CreateService(char* host, int port); // called by server
int OpenServiceAndSend(char* host, int port,char *buf,int z);
int Read(void*, int);
int Write(void*, int);
int Descriptor () { return fd; }
void Close();
protected:
int fd; // file descriptor for read/write to the UdpChannel
int domain; // UNIX domain or Internet domina
char* name; // service name -- server site
// host name -- client site
int port; // Internet prot number, not used for UNIX domain
};
#endif
Ko-Haw Nieh, Litton/Industrial Automation
1301 Harbor Bay Parkway, P.O. Box 4004, Alameda, CA 94501-0404
uunet!fernwood!lia!nieh nieh at lia.com
FAX : 415-521-5499 Tele : 415-769-5640
More information about the Comp.sys.sun
mailing list