Chinaunix首页 | 论坛 | 博客
  • 博客访问: 537120
  • 博文数量: 146
  • 博客积分: 5030
  • 博客等级: 大校
  • 技术积分: 1820
  • 用 户 组: 普通用户
  • 注册时间: 2007-07-16 20:57
文章分类

全部博文(146)

文章存档

2011年(1)

2010年(4)

2009年(30)

2008年(111)

我的朋友

分类: C/C++

2009-09-19 13:02:21

TCP服务器端得helloworld
1.程序
从《unix网络编程》抄来了,改了一点,原书使用自己封装的函数,这里都使用原始的。使用c++的stringstream和string做buffer进行write,尝试了一下。

#include

#include

#include
#include
#include
#include
#include
int main(int argc, char ** argv)
{

      int listenfd = socket(AF_INET, SOCK_STREAM, 0);//创建socket fd

       if(listenfd < 0){

              std::cout<<"create socket error!\n";

              exit(1);
       }
 

       sockaddr_in servaddr;

       bzero(&servaddr, sizeof(servaddr));

       servaddr.sin_family = AF_INET;

       servaddr.sin_addr.s_addr = htonl(INADDR_ANY);//地址为INADDR_ANY表示监听本机所有网络接口

       servaddr.sin_port = htons(1500);//监听端口,客户端程序必须连接这个端口才能与服务器交互

 
//bind函数将socket fd 与相应的地址和端口号绑定。

       if(bind(listenfd, (sockaddr*)(&servaddr), sizeof(servaddr)) < 0){

              std::cout<<"bind error!\n";

              exit(1);
       }
       //listen方法将socket fd转换为listen fd,第二个参数表示等待队列长度

       if(listen(listenfd, 5) < 0){

              std::cout<<"listen error!\n";

              exit(1);
       }
//服务器一般都是一个死循环
       for(;;){
              //监听,等待客户端的链接,accept函数是一个阻塞函数,如果客户端不连接服务器,程序将在这里停下。
      //函数返回一个连接fd,服务器使用该fd与连接进来的客户端交互,跟普通的文件fd类似。

              int connfd = accept(listenfd, 0, 0);

              if(connfd < 0){

                     std::cout<<"accept error!\n";

                     continue;
              }

              std::cout<<"a client connect me\n";

              time_t ticks = std::time(0);

              std::stringstream strout;

              strout<
       //write方法向客户端发送包
//这里没有使用char 数组做buff传送,而是使用了string,暂时没有研究过效率如何。
//测试过,客户端没有read函数时这个write也可以成功返回

              int n = write(connfd, strout.str().c_str(),strout.str().size());

              if(n < 0){

                     std::cout<<"write error!\n";

              }
              else{

                     std::cout<<"send "<

              }
//发送完毕主动关闭连接,客户端受到关闭链接消息后会退出循环(见客户端程序)
              close(connfd);
       }
}
2.下一步工作
下一步打算改造一下服务器,做一个log监控服务器,客户端向服务器发送查询log命令,服务器返回对应的log文件。
客户端暂时不管了,用telnet来调试。
 
阅读(928) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~