Linux Socket 編程小例

tcpserver.c

/**
 * Tcp Server program, It is a simple example only.
 * when client connect to server, send a welcome message and timestamp in 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>

#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);

		// inet_ntop(INET_ADDRSTRLEN,cliaddr.sin_addr,buf,BUFFER_SIZE);

		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);

	}
	close(servfd);
	return 0;
}

tcpclient.c

/**
* Tcp client program, It is a simple example only.
* connect to server, and echo a message from server.
*/

#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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章