一个简单的服务器客服端通信
2015-09-19 21:56
246 查看
/*client.cpp*/ #include <iostream> #include <stdlib.h> #include <sys/socket.h> #include <netinet/in.h> #include <errno.h> #include <string.h> #include <arpa/inet.h> #include <unistd.h> #include <netdb.h> using namespace std; int main(int argc,char *argv[]) { int sockfd; char buffer[1024]; sockaddr_in server_addr; hostent *host; int portNumber,nbytes; if(argc!=3) { cout<<"Usage:"<<argv[0]<<" hostname portnumber"<<endl; exit(1); } if((host=gethostbyname(argv[1]))==NULL) { cout<<"Get hostname error"<<endl; exit(1); } if((portNumber=atoi(argv[2]))<0) { cout<<"Usage:"<<argv[0]<<" hostname portnumber"<<endl; exit(1); } /*客户开始建立sockfd描述符*/ if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1) { cout<<"Socket error: "<<strerror(errno)<<endl; exit(1); } /*客户程序填充服务端的资料*/ bzero(&server_addr,sizeof(server_addr)); server_addr.sin_family=AF_INET; server_addr.sin_port=htons(portNumber); server_addr.sin_addr=*((in_addr*)host->h_addr); /*客户程序发起连接请求*/ if(connect(sockfd,(sockaddr*)(&server_addr),sizeof(sockaddr))==-1) { cout<<"Connect error:"<<strerror(errno)<<endl; exit(1); } /*连接成功了*/ if((nbytes=read(sockfd,buffer,1024))==-1) { cout<<"Read error: "<<strerror(errno)<<endl; exit(1); } buffer[nbytes]='\0'; cout<<"I nave received:"<<buffer<<endl; /*结束通讯*/ close(sockfd); exit(0); }
/*server.cpp*/
#include <iostream>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <errno.h>
#include <string.h>
#include <arpa/inet.h>
#include <unistd.h>
using namespace std;
int main(int argc,char *argv[])
{
int sockfd,new_fd; //socket 描述符
struct sockaddr_in server_addr;
struct sockaddr_in client_addr;
int portNumber;
socklen_t sin_size;
char hello[]="Hello!Are You Fine?\n";
if(argc!=2)
{
cout<<"Usage:"<<argv[0]<<" portNumber"<<endl;
exit(1);
}
if((portNumber=atoi(argv[1]))<0)
{
cout<<"Usage:"<<argv[0]<<" portNumber"<<endl;
exit(1);
}
/*服务器端开始建立socket描述符*/
if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
{
cout<<"Socket error:"<<strerror(errno)<<endl;
exit(1);
}
/*服务器填充sockaddr结构*/
bzero(&server_addr,sizeof(struct sockaddr_in));
server_addr.sin_family=AF_INET;
server_addr.sin_addr.s_addr=htonl(INADDR_ANY);
server_addr.sin_port=htons(portNumber);
/*捆绑socket描述符*/
if(bind(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1)
{
cout<<"Bind error:"<<strerror(errno);
exit(1);
}
/*监听sockfd描述符*/
if(listen(sockfd,5)==-1) //5为套接字排队的最大连接个数
{
cout<<"Listen error:"<<strerror(errno)<<endl;
exit(1);
}
while(1)
{
/*服务器阻塞,直到客户程序建立连接*/
sin_size=sizeof(struct sockaddr_in);
if((new_fd=accept(sockfd,(struct sockaddr *)(&client_addr),&sin_size))==-1)
{
cout<<"Accept error:"<<strerror(errno)<<endl;
exit(1);
}
cout<<"Server get connection from "<<inet_ntoa(client_addr.sin_addr)<<endl;
if(write(new_fd,hello,strlen(hello))==-1)
{
cout<<"Write error:"<<strerror(errno)<<endl;
exit(1);
}
/*这个通讯已经结束*/
close(new_fd);
/*循环下一个*/
}
close(sockfd);
exit(0);
}
相关文章推荐
- Apache Awstats 安装配置系列 (3)之 perl 安装
- UVa 300 - Maya Calendar
- 杭电acm--2081
- node 的 异步 数据库 调用 处理
- Android Studio 百度地图开发
- C#操作excel时,报错:未在本地计算机上注册“Microsoft.Jet.OLEDB.4.0”提供程序。
- Android注释技巧
- 汇编语言学习01
- css改变背景透明度【转】
- 互联网IP合全局路由优化的原则-Dijkstra算法证明
- K近邻算法原理及实现(Python)
- 软件开发常用英语词汇
- Set Up VTune Amplifier(windows) 2015 for Remote (linux)Analysis
- 回文判断 移动圆桌 同时在线时间聊天
- uCOS-II中断相关函数介绍
- CentOS 安装远程桌面工具 xrdp 0.6.1
- MySQL 性能优化的最佳 20+ 条经验
- SQLite3使用方法大全(二)之数据类型
- sublime常用快捷键
- LintCode 两个字符串是变位词