Solaris socket编程
Server
#include <stdio.h>
#include <sys/socket.h>
#include <unistd.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <time.h>
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
#define SERVER_PORT 20000 // define the defualt connect port id
#define LENGTH_OF_LISTEN_QUEUE 10 // length of listen queue in server
#define BUFFER_SIZE 255
#define WELCOME_MESSAGE "welcome to connect the server. "
int main( int argc, char ** argv)
{
int servfd,clifd;
struct sockaddr_in servaddr,cliaddr;
if ((servfd = socket(AF_INET,SOCK_STREAM, 0 )) < 0 )
{
printf( " create socket error!\n " );
exit( 1 );
}
bzero(&servaddr, sizeof (servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(SERVER_PORT);
servaddr.sin_addr.s_addr = htons(INADDR_ANY);
if (bind(servfd,( struct sockaddr * ) & servaddr, sizeof (servaddr)) < 0 )
{
printf( " bind to port %d failure!\n " ,SERVER_PORT);
exit( 1 );
}
if (listen(servfd,LENGTH_OF_LISTEN_QUEUE) < 0 )
{
printf( " call listen failure!\n " );
exit( 1 );
}
while ( 1 )
{ // server loop will nerver exit unless any body kill the process
char buf[BUFFER_SIZE];
long timestamp;
socklen_t length = sizeof (cliaddr);
clifd = accept(servfd,( struct sockaddr * ) & cliaddr, & length);
if (clifd < 0 )
{
printf( " error comes when call accept!\n " );
break ;
}
strcpy(buf,WELCOME_MESSAGE);
printf( " from client,IP:%s,Port:%d\n " ,inet_ntoa(cliaddr.sin_addr),ntohs(cliaddr.sin_port));
timestamp = time(NULL);
strcat(buf, " timestamp in server: " );
strcat(buf,ctime( & timestamp));
send(clifd,buf,BUFFER_SIZE, 0 );
close(clifd);
} // exit
close(servfd);
return 0 ;
}
Server 编译
cc –c server.c
cc -o srv server.o -lsocket –lnsl
client
#include <stdio.h>
#include <sys/socket.h>
#include <unistd.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <stdlib.h>
#define SERVER_PORT 20000 // define the defualt connect port id
#define CLIENT_PORT ((20001+rand())%65536) // define the defualt client port as a random port
#define BUFFER_SIZE 255
#define REUQEST_MESSAGE "welcome to connect the server.\n"
void usage( char * name)
{
printf( " usage: %s IpAddr\n " ,name);
}
int main( int argc, char ** argv)
{
int servfd,clifd,length = 0 ;
struct sockaddr_in servaddr,cliaddr;
socklen_t socklen = sizeof (servaddr);
char buf[BUFFER_SIZE];
if (argc < 2)
{
usage(argv[ 0 ]);
exit( 1 );
}
if ((clifd = socket(AF_INET,SOCK_STREAM, 0 )) < 0 )
{
printf( " create socket error!\n " );
exit( 1 );
}
srand(time(NULL)); // initialize random generator
bzero( & cliaddr, sizeof (cliaddr));
cliaddr.sin_family = AF_INET;
cliaddr.sin_port = htons(CLIENT_PORT);
cliaddr.sin_addr.s_addr = htons(INADDR_ANY);
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
inet_aton(argv[1], &servaddr.sin_addr);
servaddr.sin_port = htons(SERVER_PORT);
// servaddr.sin_addr.s_addr = htons(INADDR_ANY);
if (bind(clifd,( struct sockaddr * ) & cliaddr, sizeof (cliaddr)) < 0 )
{
printf( " bind to port %d failure!\n " ,CLIENT_PORT);
exit( 1 );
}
if (connect(clifd,( struct sockaddr * ) & servaddr, socklen) < 0 )
{
printf( " can't connect to %s!\n " ,argv[ 1 ]);
exit( 1 );
}
length = recv(clifd,buf,BUFFER_SIZE, 0 );
if (length < 0 )
{
printf( " error comes when recieve data from server %s! " ,argv[ 1 ]);
exit( 1 );
}
printf( " from server %s :\n\t%s " ,argv[ 1 ],buf);
close(clifd);
return 0 ;
}
Client编译
cc –c client.c
cc -o client client.o -lsocket -lresolv
传送和接收二进制流的方法
struct book
{
char name[10];
double price;
};
struct book m_book;
send(clifd, (char*)&m_book, sizeof(m_book), 0);
{
char name[10];
double price;
};
struct book m_book;
send(clifd, (char*)&m_book, sizeof(m_book), 0);
recv(clifd, (char*)&m_book, sizeof(m_book), 0 );
转载于:https://blog.51cto.com/huangdh/212280