免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1682 | 回复: 0
打印 上一主题 下一主题

unix网络编程读书报告1——最简单的tcp客户端 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-09-17 11:20 |只看该作者 |倒序浏览

               

  Normal
  0
  
  
  
  7.8 磅
  0
  2
  
  false
  false
  false
  
  EN-US
  ZH-CN
  X-NONE
  
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
  
  MicrosoftInternetExplorer4
  
   
   
   
   
   
   
   
   
   
   
   
  

  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  

/* Style Definitions */
table.MsoNormalTable
        {mso-style-name:普通表格;
        mso-tstyle-rowband-size:0;
        mso-tstyle-colband-size:0;
        mso-style-noshow:yes;
        mso-style-priority:99;
        mso-style-qformat:yes;
        mso-style-parent:"";
        mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
        mso-para-margin:0cm;
        mso-para-margin-bottom:.0001pt;
        mso-pagination:widow-orphan;
        font-size:10.0pt;
        font-family:"Calibri","sans-serif";
        mso-ascii-font-family:Calibri;
        mso-ascii-theme-font:minor-latin;
        mso-hansi-font-family:Calibri;
        mso-hansi-theme-font:minor-latin;
        color:blue;
        mso-themecolor:hyperlink;
        mso-font-kerning:1.0pt;
        mso-bidi-font-style:italic;
        text-decoration:underline;
        text-underline:single;}
公司走形式主义,非要我们写个小项目当作培训,用以学习socket。虽然我还是菜鸟,但绝非刚刚接触socket,3年前我就在linux下写过p2p程序,呵呵。正好从头到尾的读一下《unix网络编程》,没事写写读书报告自娱自乐。
      
     TCP客户端的helloworld
程序从《unix网络编程》中抄下来的,改了一点东西。

#include
#include //包含一些 socket函数的头文件
#include //包含sockaddr_in的头文件
#include //包含一些类似inet_pton这样的转换函数的头文件
#include //一些类型的定义
int main(int argc, char ** argv)
{
    if(argc !=
2){
       std::cout\n";
       exit(1);
    }
//创建一个socket fd,该fd在以后作为这个套接字的唯一标识,类似于普通的文件描述符,可以对其进行读写,结果就是首发消息。
    int
sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if(sockfd
       exit(1);
    }
    //地址数据结构
    sockaddr_in
servaddr;
    bzero(&servaddr,
sizeof(servaddr));//清零
    servaddr.sin_family
= AF_INET;//ipv4
    //端口,22,ssh的端口,原书使用13,但是170没有开放13端口,所以这里使用22,需要htons函数将本地的22转换成网络格式,h表示本地,to转换,n表示network,s表示short
    servaddr.sin_port
= htons(22);
//inet_pton将本地的字符串ip地址转换成网络上的格式,在gdb下查看其是一个整数
    if(inet_pton(AF_INET,
argv[1], &servaddr.sin_addr)        exit(1);
    }
    //链接,参数是socket fd,地址结构(需要强制转换成sockaddr指针),地址长度
    if(connect(sockfd,
(sockaddr *)&servaddr, sizeof(servaddr))        exit(1);
    }

    int n;
    const int
MAXLINE = 1024;
    char
recvline[MAXLINE];
    int sum = 0;
    //读取消息,链接到ssh上后,170服务器会返回20个字符长度的字符串“SSH-2.0-OpenSSH_4.3”,这个字符串可能分几次读取出来,最常见的是1次。
while( (n = read(sockfd, recvline, MAXLINE)) > 0){
       recvline[n]
= 0;
       if(fputs(recvline,
stdout) == EOF){
           std::cout           exit(1);
       }   
        //原书没有这段,因为13号端口是时间服务器,服务器返回时间后就会断掉socket,所以read就会返回-1,结束循环,但是ssh服务不会主动断掉socket,所以read阻塞,程序没有响应。因此,在收到20个字符后,客户端主动close掉socket。
结束读写有很多种方法,需要自己来定应用层协议,呵呵。
       sum += n;
       if (sum
>= 20){
           close(sockfd);
           std::cout       }
    }
    if(n        exit(1);
    }
    close(sockfd);
    return 0;
}
               
               
               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u1/43391/showart_2054383.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP