[SOCKETS] Solaris server in C, NT client in VB
Warning! C/sockets newbie ahead!
I seem to be having some issues here trying to get these 2 apps to communicate. I'm getting a weird behavior issue but I don't know if it's server side or client side. The client is a simple VB app with a few buttons to connect, send, and disconnect. It sends test in one textbox and receives it in another. That works fine. The problem is that after the winsock.sendata method is called on the client, the tcpClient.state becomes 8 ("Peer is closing the connection"). I'm not sure why this happens. I thought it might be the close( new_fd ) line in the server code but it happens even with that line commented out. The server code is modified Beej code (Thanks Beej!). I took out the fork just to make it a little easier for me to follow what is happening. The problem happens in both versions though. Here is the server code, the client code is all of about 10 lines and not really worth posting on a C board. Yes, I know I should just use a C client but I don't have a compiler I can use at the moment.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/wait.h>
#include <signal.h>
#define MYPORT 60000 // the port users will be connecting to
#define BACKLOG 10 // how many pending connections queue will hold
#define MAXDATASIZE 100 // max number of bytes we can get at once
void sigchld_handler( int s )
{
while( wait( NULL ) > 0 );
}
int main( void )
{
/* BEGIN FUNCTION PROTOTYPES */
void checksystem( );
/* END FUNCTION PROTOTYPES */
int numbytes, fd[ 2 ];
char buf[ MAXDATASIZE ];
int sockfd, new_fd; // listen on sock_fd, new connection on new_fd
struct sockaddr_in my_addr; // my address information
struct sockaddr_in their_addr; // connector's address information
int sin_size;
struct sigaction sa;
int yes = 1;
if( ( sockfd = socket( AF_INET, SOCK_STREAM, 0 ) ) == -1 )
{
perror( "socket" );
exit( 1 );
}
if( setsockopt( sockfd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof( int ) ) == -1 )
{
perror( "setsockopt" );
exit( 1 );
}
my_addr.sin_family = AF_INET; // host byte order
my_addr.sin_port = htons( MYPORT ); // short, network byte order
my_addr.sin_addr.s_addr = INADDR_ANY; // automatically fill with my IP
memset( &( my_addr.sin_zero ), '\0', 8 ); // zero the rest of the struct
if( bind( sockfd, ( struct sockaddr * )&my_addr, sizeof( struct sockaddr ) ) == -1 )
{
perror( "bind" );
exit( 1 );
}
if( listen( sockfd, BACKLOG ) == -1 )
{
perror( "listen" );
exit( 1 );
}
sa.sa_handler = sigchld_handler; // reap all dead processes
sigemptyset( &sa.sa_mask );
sa.sa_flags = SA_RESTART;
if( sigaction( SIGCHLD, &sa, NULL ) == -1 )
{
perror( "sigaction" );
exit( 1 );
}
while( 1 )
{ // main accept() loop
sin_size = sizeof( struct sockaddr_in );
if( ( new_fd = accept( sockfd, ( struct sockaddr * )&their_addr, &sin_size ) ) == -1 )
{
perror( "accept" );
continue;
}
printf( "server: got connection from %s\n", inet_ntoa( their_addr.sin_addr ) );
printf( "server: new_fd = %d\n", new_fd );
if( ( numbytes = recv( new_fd, buf, MAXDATASIZE-1, 0 ) ) == -1 ) {
perror( "recv" );
exit( 1 );
}
buf[ numbytes ] = '\0';
if( strcmp( buf, "testmatch" ) == 0 )
{
if( send( new_fd, "They matched!\n" , 14, 0 ) == -1 )
perror( "send" );
/*checksystem( );*/
}
if( send( new_fd, buf, 14, 0 ) == -1 )
perror( "send" );
close( new_fd );
}
return 0;
}
void checksystem( )
{
//forked process....
}