1. 程式人生 > >linux網路程式設計——Socket

linux網路程式設計——Socket

//server
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

static void usage(const char* proc)
{
	printf("usage:%s [port]\n", proc);
}

int startup(int _port)
{
	int sock = socket(AF_INET, SOCK_STREAM, 0);
	if(sock < 0)
	{
		perror("creat socket fail");
		exit(1);
	}
	
	struct sockaddr_in server;
	
	memset(&server, 0, sizeof(server));
	server.sin_family = AF_INET;
	server.sin_port = htons(_port);
	server.sin_addr.s_addr = htonl(INADDR_ANY);
	
	if(bind(sock, (struct sockaddr*)&server, sizeof(server)) < 0)
	{
		perror("bind error");
		exit(2);
	}
	
	if(listen(sock, 5) < 0)
	{
		perror("listen error");
		exit(3);
	}
	
	return sock;
}

int main(int argc, char* argv[])
{	
	if(argc != 2)
	{
		usage(argv[0]);
		return 3;
	}
	
	int listen_socket = startup(atoi(argv[1]));
	
	struct sockaddr_in remote;
	socklen_t len = sizeof(struct sockaddr_in);
	
	while(1)
	{
		int socket = accept(listen_socket, (struct sockaddr*)&remote, &len);
		if(socket < 0)
		{
			perror("accept error");
			continue;
		}
		
		printf("#client, ip:%s, port:%d#\n", inet_ntoa(remote.sin_addr), ntohs(remote.sin_port));
		
		char buf[1024];
		while(1)
		{
			ssize_t _s = read(socket, buf, sizeof(buf)-1);
			if(_s > 0)
			{
				buf[_s] = 0;
				printf("#client# %s\n", buf);
			}
			else
			{
				printf("client is quit!\n");
				break;
			}
		}
		close(socket);
	}
	return 0;
	
}

//client
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>


static void usage(const char* proc)
{
	printf("usage:%s [ip] [port]\n", proc);
}

int main(int argc, char* argv[])
{
	if(argc != 3)
	{
		usage(argv[0]);
		return 3;
	}
	
	int sock = socket(AF_INET, SOCK_STREAM, 0);
	
	if(sock < 0)
	{
		perror("socket error");
		exit(1);
	}
	
	struct sockaddr_in server;
	
	memset(&server, 0, sizeof(server));
	server.sin_family = AF_INET;
	server.sin_port = htons(atoi(argv[2]));
	server.sin_addr.s_addr = inet_addr(argv[1]);
	
	if(connect(sock, (struct sockaddr*)&server, sizeof(server)) < 0)
	{
		perror("connect error");
		exit(2);
	}
	
	char buf[1024];
	
	while(1)
	{
		printf("#send# ");
		fflush(stdout);
		ssize_t _s = read(0, buf,  sizeof(buf)-1);
		buf[_s-1] = 0;
		write(sock, buf, _s);
	}
	close(sock);
	return 0;
}