流式套接字客户端/服务器编程

此例子将利用上一篇介绍的套接字基础概念实现一个最基本的流式套接字客户端/服务器通信程序。在该程序中,客户端和服务器将按照如下步骤交互:

1)客户端向服务器发出日期请求字符串,如%D%Y%A%T等

2)服务器从网络接收到日期时间请求字符串后,根据字符串格式生成对应的日期时间值返回给客户端

为了简化程序美图出套接字变成的关键内容,该实例略去了对请求字符串进行合法的校验的处理。

服务器端程序:

#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;

#define BUFSIZE 512

int main(int argc, char *argv[])
{
	int sockfd;				/*服务器套接字*/
	int new_fd;				/*服务器链接套接字 */
	struct sockaddr_in server_addr;			/*服务器监听套接字*/
	struct sockaddr_in client_addr;			/*客户端IP地址*/

	socklen_t size;
	int portnum;
	
	char reqBuf[BUFSIZE];					/* 应用接收缓存 */
	char dtfmt[BUFSIZE];					/*日期-时间结果字符串*/
	time_t td;
	struct tm tm;

	int z;

	if(argc != 2)
	{
		cout<<"Usage:"<


客户端程序:

#include
#include
#include
#include
#include
#include
#include
#include

#define BUFSIZE 512

using namespace std;

int main(int argc,char *argv[])
{
	int sockfd;
	char buf[BUFSIZE];
	struct sockaddr_in server_addr;
	struct hostent *host;
	int portnumber;
	int nbytes;
	int z;
	char reqBuf[BUFSIZE];

	if(argc != 3)
	{
		cout<<"Usage: "<h_addr);


	/*链接服务器*/
	if(connect(sockfd,(struct sockaddr *)(&server_addr),sizeof(server_addr)) == -1)
	{
		cout<<"Connect Error\n";
		exit(1);
	}

	cout<<"connect to server "<>reqBuf))
		{
			break;
		}

		/*
		 *为日期时间请求格式字符串添加NULL字符作为结尾,
		 *另外同时去掉末尾的换行符号 
		 */
		z = strlen(reqBuf);
		if(z > 0 && reqBuf[--z] == '\n')
			reqBuf[z] = 0;

		if(z == 0)
			continue;

		/*
		 *输入‘quit’退出
		 */
		if(!strcasecmp(reqBuf,"QUIT"))
		{
			cout<<"press any key to end client.\n";
			getchar();
			break;
		}

		/* 
		 *发送日期时间请求字符串到服务器,注意请求信息中去掉了NULL字符
		 */
		z = write(sockfd,reqBuf,strlen(reqBuf));
		if(z < 0)
		{
			cout<<"Write Error\n";
			exit(1);
		}

		/* 
		 *从客户端套接字中读取服务器发回的应答
		 */
		if((nbytes = read(sockfd,buf,sizeof(buf))) == -1)
		{
			cout<<"Read Error\n";
			exit(1);
		}

		/*
		 *若服务器忧郁某种原因关闭了连接,则客户端需要处理此事件
		 */
		if(nbytes == 0)
		{
			cout<<"server has closed the socket.\n";
			cout<<"press any key to exit...\n";
			exit(1);
		}

		buf[nbytes] = '\0';

		/*
		 *输出日期时间结果
		 */
		cout<<"result form "<

服务器命令:
$./srvsingle 9000
waiting for the client's request...
The Server got connection from 115.156.202.166

客户端命令:
$./ClientSingle 119.156.202.166 9000
Enter format string (^D or 'quit' to exit): %D%Y%A%T
result form 115.156.202.166 port 9000 : 
04/17/132013Wednesday10:14:56



你可能感兴趣的:(网络编程)