基于 Socket 的 UDP 和 TCP 编程介绍(转)

一、概述 TCP(传输控制协议)和UDP(用户数据报协议是网络体系结TCP/IP模型中传输层一层中的两个不同的通信协议。 TCP:传输控制协议,一种面向连接的协议,给用户进程提供可靠的全双工的字节流,TCP套接口是字节流套接口(stream socket)的一种。 UDP:用户数据报协议。 Nike Air Presto Homme Jordan 11 enfants UDP是一种无连接协议。UDP套接口是数据报套接口(datagram socket)的一种。 louboutin homme nike air jordan 11 homme nike cortez bambini Nike Air Max Goedkoop 二、TCP和UDP介绍 1)基本TCP客户—服务器程序设计基本框架 说明:(三路握手) 1.客户端发送一个SYN段(同步序号)指明客户打算连接的服务器端口,以及初始化序号(ISN) 。 Nike Air Presto femme Nike Air Max 2016 Femme 2.服务器发回包含服务器的初始序号的SYN报文段作为应答。 nike pas cher 同时,将确认序号(ACK)设置为客户的ISN加1以对客户的SYN 报文段进行确认。 Nike Air Max 90 Femme Blanche 一个SYN将占用一个序号。 nike air max 97 homme Richard Sherman Seattle Seahawks Jersey 3.客户必须将确认序号设置为服务器的ISN加1以对服务器的SYN报文段进行确认。 2) 基本TCP客户—服务器程序设计基本框架流程图具体参见原文 3) UDP和TCP的对比: UDP没有三次握手过程。简单点说。UDP处理的细节比TCP少。 nike scarpe italia shop UDP不能保证消息被传送到(它也报告消息没有传送到)目的地。 adidas neo 10k męskie UDP也不保证数据包的传送顺序。 asics pas cher UDP把数据发出去后只能希望它能够抵达目的地。 nike free 5.0 donna TCP优缺点: 优点: 1.TCP提供以认可的方式显式地创建和终止连接。 2.TCP保证可靠的、顺序的(数据包以发送的顺序接收)以及不会重复的数据传输。 Kopen Nike Air Max 2017 Goedkoop 3.TCP处理流控制。 Nike Air Max Tavas femme 4.允许数据优先 5.如果数据没有传送到,则TCP套接口返回一个出错状态条件。 6.TCP通过保持连续并将数据块分成更小的分片来处理大数据块。—无需程序员知道 缺点: TCP在转移数据时必须创建(并保持)一个连接。 nike tn homme blanche latelierdecaro.fr 这个连接给通信进程增加了开销,让它比UDP速度要慢。 nike air zoom pegasus 34 femme New Balance 515 femme UDP优缺点: 1.UDP不要求保持一个连接 2.UDP没有因接收方认可收到数据包(或者当数据包没有正确抵达而自动重传)而带来的开销。 Adidas Zx Flux Homme Pas Cher adidas gazelle męskie 3.设计UDP的目的是用于短应用和控制消息 4.在一个数据包连接一个数据包的基础上,UDP要求的网络带宽比TDP更小。 三、Socket编程 Socket接口是TCP/IP网络的API,Socket接口定义了许多函数或例程,程序员可以用它们来开发TCP/IP网络上的应用程序。要学Internet上的TCP/IP网络编程,必须理解Socket接口。 Air Jordan 14 Homme nike roshe flyknit uomo adidas superstar mujer Socket接口设计者最先是将接口放在Unix操作系统里面的。 New Balance Homme 如果了解Unix系统的输入和输出的话,就很容易了解Socket了。网络的Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符。 Nike Air Max 95 homme asics gel lyte 3 uomo Socket也具有一个类似于打开文件的函数调用Socket(),该函数返回一个整型的Socket描述符,随后的连接建立、数据传输等操作都是通过该Socket实现的。 ff14 gil for sale nike internationalist femme 常用的Socket类型有两种:流式Socket(SOCK_STREAM)和数据报式Socket(SOCK_DGRAM)。 asics gel kinsei 5 homme 流式是一种面向连接的Socket,针对于面向连接的TCP服务应用;数据报式Socket是一种无连接的Socket,对应于无连接的UDP服务应用。 1、socket调用库函数主要有: 创建套接字 Socket(af,type,protocol) 建立地址和套接字的联系 bind(sockid, local addr, addrlen) 服务器端侦听客户端的请求 listen( Sockid ,quenlen) 建立服务器/客户端的连接 (面向连接TCP) 客户端请求连接 Connect(sockid, destaddr, addrlen) 服务器端等待从编号为Sockid的Socket上接收客户连接请求 newsockid=accept(Sockid,Clientaddr, paddrlen) 发送/接收数据 面向连接: send(sockid, buff, bufflen) recv( ) 面向无连接: sendto(sockid,buff,…,addrlen) recvfrom( ) 释放套接字 close(sockid) 2、TCP/IP应用编程接口(API) 服务器的工作流程:首先调用socket函数创建一个Socket,然后调用bind函数将其与本机地址以及一个本地端口号绑定,然后调用listen在相应的socket上监听,当accpet接收到一个连接服务请求时,将生成一个新的socket。 New Balance 1400 homme 服务器显示该客户机的IP地址,并通过新的socket向客户端发送字符串” hi,I am server!”。 Nike Roshe Run homme 最后关闭该socket。 Parajumper Gobi Femme Nike Homme main() { int sock_fd, client_fd; /*sock_fd:监听socket;client_fd:数据传输socket */ struct sockaddr_in ser_addr; /* 本机地址信息 */ struct sockaddr_in cli_addr; /* 客户端地址信息 */ char msg[MAX_MSG_SIZE]; /* 缓冲区*/ ser_sockfd = socket( AF_INET, SOCK_STREAM, 0 ); /*创建连接的SOCKET */ if ( ser_sockfd < 0 ) { /*创建失败 */ fprintf( stderr, “socker Error:%sn”, strerror( errno ) ); exit( 1 ); } /* 初始化服务器地址*/ addrlen = sizeof(struct sockaddr_in); bzero( &ser_addr, addrlen ); ser_addr.sin_family = AF_INET; ser_addr.sin_addr.s_addr = htonl( INADDR_ANY ); ser_addr.sin_port = htons( SERVER_PORT ); if ( bind( ser_sockfd, (struct sockaddr *) &ser_addr, sizeof(struct sockaddr_in) ) < 0 ) { /*绑定失败 */ fprintf( stderr, “Bind Error:%sn”, strerror( errno ) ); exit( 1 ); } /*侦听客户端请求*/ if ( listen( ser_sockfd, BACKLOG ) < 0 ) { fprintf( stderr, “Listen Error:%sn”, strerror( errno ) ); close( ser_sockfd ); exit( 1 ); } while ( 1 ) { /* 等待接收客户连接请求*/ cli_sockfd = accept( ser_sockfd, (struct sockaddr *) &cli_addr, &addrlen ); if ( cli_sockfd <= 0 ) { fprintf( stderr, “Accept Error:%sn”, strerror( errno ) ); }else { /*开始服务*/ recv( cli_addr, msg, MAX_MSG_SIZE, 0 ); /* 接受数据*/ printf( “received a connection from %sn”, inet_ntoa( cli_addr.sin_addr ) ); printf( “%sn”, msg ); /*在屏幕上打印出来 */ strcpy( msg, “hi,I am server!” ); send( cli_addr, msg, sizeof(msg), 0 ); /*发送的数据*/ close( cli_addr ); } } close( ser_sockfd ); } 客户端的工作流程:首先调用socket函数创建一个Socket,然后调用bind函数将其与本机地址以及一个本地端口号绑定,请求连接服务器,通过新的socket向客户端发送字符串” hi,I am client!”。 New Balance 574 homme Nike Air Zoom Pegasus 31 homme nike air max 1 femme noir 最后关闭该socket。

  • Nike Air Max 1 Femme
  • main() { int cli_sockfd; /*客户端SOCKET */ int addrlen; char seraddr[14]; struct sockaddr_in ser_addr, /* 服务器的地址*/ cli_addr; /* 客户端的地址*/ char msg[MAX_MSG_SIZE]; /* 缓冲区*/ GetServerAddr( seraddr ); cli_sockfd = socket( AF_INET, SOCK_STREAM, 0 ); /*创建连接的SOCKET */ if ( ser_sockfd < 0 ) { /*创建失败 */ fprintf( stderr, “socker Error:%sn”, strerror( errno ) ); exit( 1 ); } /* 初始化客户端地址*/ addrlen = sizeof(struct sockaddr_in); bzero( &ser_addr, addrlen ); cli_addr.sin_family = AF_INET; cli_addr.sin_addr.s_addr = htonl( INADDR_ANY ); cli_addr.sin_port = 0; if ( bind( cli_sockfd, (struct sockaddr *) &cli_addr, addrlen ) < 0 ) { /*棒定失败 */ fprintf( stderr, “Bind Error:%sn”, strerror( errno ) ); exit( 1 ); } /* 初始化服务器地址*/ addrlen = sizeof(struct sockaddr_in); bzero( &ser_addr, addrlen ); ser_addr.sin_family = AF_INET; ser_addr.sin_addr.s_addr = inet_addr( seraddr ); ser_addr.sin_port = htons( SERVER_PORT ); if ( connect( cli_sockfd, (struct sockaddr *) &ser_addr, &addrlen ) != 0 ) /*请求连接*/ { /*连接失败 */ fprintf( stderr, “Connect Error:%sn”, strerror( errno ) ); close( cli_sockfd ); exit( 1 ); } strcpy( msg, “hi,I am client!” ); send( sockfd, msg, sizeof(msg), 0 ); /*发送数据*/ recv( sockfd, msg, MAX_MSG_SIZE, 0 ); /* 接受数据*/ printf( “%sn”, msg ); /*在屏幕上打印出来 */ close( cli_sockfd ); } 服务器的工作流程:首先调用socket函数创建一个Socket,然后调用bind函数将其与本机地址以及一个本地端口号绑定,接收到一个客户端时,服务器显示该客户端的IP地址,并将字串返回给客户端。 3、UDP/IP应用编程接口(API) int main( int argc, char **argv ) { int ser_sockfd; int len; /* int addrlen; */ socklen_t addrlen; char seraddr[100]; struct sockaddr_in ser_addr; /*建立socket*/ ser_sockfd = socket( AF_INET, SOCK_DGRAM, 0 ); if ( ser_sockfd < 0 ) { printf( “I cannot socket successn” ); return(1); } /*填写sockaddr_in 结构*/ addrlen = sizeof(struct sockaddr_in); bzero( &ser_addr, addrlen ); ser_addr.sin_family = AF_INET; ser_addr.sin_addr.s_addr = htonl( INADDR_ANY ); ser_addr.sin_port = htons( SERVER_PORT ); /*绑定客户端 * if(bind(ser_sockfd,(struct sockaddr *)&ser_addr,addrlen)<0) * { * printf(“connect”); * return 1; * } * while(1) * { * bzero(seraddr,sizeof(seraddr)); * len=recvfrom(ser_sockfd,seraddr,sizeof(seraddr),0,(struct sockaddr*)&ser_addr,&addrlen); * /*显示client端的网络地址*/ printf( “receive from %sn”, inet_ntoa( ser_addr.sin_addr ) ); /*显示客户端发来的字串*/ printf( “recevce:%s”, seraddr ); /*将字串返回给client端*/ sendto( ser_sockfd, seraddr, len, 0, (struct sockaddr *) &ser_addr, addrlen ); } 客户端的工作流程:首先调用socket函数创建一个Socket,填写服务器地址及端口号,从标准输入设备中取得字符串,将字符串传送给服务器端,并接收服务器端返回的字符串。 nike internationalist uomo Nike Air Max Thea Femme Noir nike tn homme blanche 最后关闭该socket。 nike cortez epic uomo Nike Air Presto enfants nike air max 2015 hombre int GetServerAddr( char * addrname ) { printf( “please input server addr:” ); scanf( “%s”, addrname ); return(1); } int main( int argc, char **argv ) { int cli_sockfd; int len; socklen_t addrlen; char seraddr[14]; struct sockaddr_in cli_addr; char buffer[256]; GetServerAddr( seraddr ); /* 建立socket*/ cli_sockfd = socket( AF_INET, SOCK_DGRAM, 0 ); if ( cli_sockfd < 0 ) { printf( “I cannot socket successn” ); return(1); } /* 填写sockaddr_in*/ addrlen = sizeof(struct sockaddr_in); bzero( &cli_addr, addrlen ); cli_addr.sin_family = AF_INET; cli_addr.sin_addr.s_addr = inet_addr( seraddr ); /* cli_addr.sin_addr.s_addr=htonl(INADDR_ANY); */ cli_addr.sin_port = htons( SERVER_PORT ); bzero( buffer, sizeof(buffer) ); /* 从标准输入设备取得字符串*/ len = read( STDIN_FILENO, buffer, sizeof(buffer) ); /* 将字符串传送给server端*/ sendto( cli_sockfd, buffer, len, 0, (struct sockaddr *) &cli_addr, addrlen ); /* 接收server端返回的字符串*/ len = recvfrom( cli_sockfd, buffer, sizeof(buffer), 0, (struct sockaddr *) &cli_addr, &addrlen ); /* printf(“receive from %sn”,inet_ntoa(cli_addr.sin_addr)); */ printf( “receive: %s”, buffer ); close( cli_sockfd ); } 四、调试 Makefile文件为: CC=gcc all:server client CFLAGS=-o server: server.c $(CC) $(CFLAGS) $@ server.c client: client.c $(CC) $(CFLAGS) $@ client.c clean: rm -f server client 运行:在shell中执行make进行编译,make clean删除生成文件。

    Posted in Linux | Leave a comment

    使用VNC连接Linux

    一般我们平时都是用Putty, nike kwazi enfants nike kwazi femme 远程连接Linux。 New Balance 678 homme Parajumpers Masterpiece Passport 这个是文本界面, louboutin pas cher Nike Air Max 95 Homme 敲命令没什么, New Balance Homme Nike Roshe Run Motif Homme 要想看个图有点费劲儿。 buy ffxiv gil cheap christian louboutin paris 想用Linux图形界面时可以在终端输入startx。 nike sandali bambini nike air jordan 3 homme 但服务器一般在机房放着呢, Nike Blazer Femme New Balance 533 femme 要是远程也能用图形岂不美哉? 接下来就给大家说一下VNC的使用,

    Posted in Linux | Leave a comment

    转 SSH 远程连接服务慢的解决方案

    连接慢的主要原因是DNS解析导致

    解决方法: 1、在ssh服务端上更改/etc/ssh/sshd_config文件中的配置为如下内容:

    1. UseDNS no
    2. # GSSAPI options
    3. GSSAPIAuthentication no

    然后,执行/etc/init.d/sshd restart重启sshd进程使上述配置生效,在连接一般就不慢了。 baskets new balance pas cher nike air max 2016 hombre 2、如果还慢的话,检查ssh服务端上/etc/hosts文件中,127.0.0.1对应的主机名是否和 uname -n的结果一样,或者把本机ip和hostname(uname -n结果)加入到/etc/hosts里。 louboutin flat sandals Nike Air Jordan Baratas

    1. [root@C64 ~]# uname -n
    2. C64
    3. [root@C64 ~]# cat /etc/hosts
    4. #modi by oldboy 11:12 2013/9/24
    5. 127.0.0.1 C64 localhost localhost.localdomain localhost4 localhost4.localdomain4
    6. ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
    7. 10.0.0.18 C64
    8. ################


    利用ssh -v的调试功能查找慢的原因

    其实可以用下面的命令调试为什么慢的细节(学习这个思路很重要)。 Nike Air Presto femme asics adidasi de sala

    1. [root@C64 ~]# ssh -v root@10.0.0.19
    2. OpenSSH_5.3p1, OpenSSL 1.0.0-fips 29 Mar 2010
    3. debug1: Reading configuration data /etc/ssh/ssh_config
    4. debug1: Applying options for *
    5. debug1: Connecting to 10.0.0.19 [10.0.0.19] port 22.
    6. debug1: Connection established.
    7. debug1: permanently_set_uid: 0/0
    8. debug1: identity file /root/.ssh/identity type -1
    9. debug1: identity file /root/.ssh/id_rsa type -1
    10. debug1: identity file /root/.ssh/id_dsa type -1
    11. debug1: Remote protocol version 2.0, remote software version OpenSSH_4.3
    12. debug1: match: OpenSSH_4.3 pat OpenSSH_4*
    13. debug1: Enabling compatibility mode for protocol 2.0
    14. debug1: Local version string SSH-2.0-OpenSSH_5.3
    15. debug1: SSH2_MSG_KEXINIT sent
    16. debug1: SSH2_MSG_KEXINIT received
    17. debug1: kex: server->client aes128-ctr hmac-md5 none
    18. debug1: kex: client->server aes128-ctr hmac-md5 none
    19. debug1: SSH2_MSG_KEX_DH_GEX_REQUEST(1024<1024<8192) sent
    20. debug1: expecting SSH2_MSG_KEX_DH_GEX_GROUP
    21. debug1: SSH2_MSG_KEX_DH_GEX_INIT sent
    22. debug1: expecting SSH2_MSG_KEX_DH_GEX_REPLY
    23. The authenticity of host '10.0.0.19 (10.0.0.19)' can't be established.
    24. RSA key fingerprint is ca:18:42:76:0e:5a:1c:7d:ef:fc:24:75:80:11:ad:f9.
    25. Are you sure you want to continue connecting (yes/no)? yes
    26. =======>老男孩老师评:这里就是提示保存密钥的交互提示。 nike pas cher nike air max 2017 femme rouge
    27. Warning: Permanently added '10.0.0.19' (RSA) to the list of known hosts.
    28. debug1: ssh_rsa_verify: signature correct
    29. debug1: SSH2_MSG_NEWKEYS sent
    30. debug1: expecting SSH2_MSG_NEWKEYS
    31. debug1: SSH2_MSG_NEWKEYS received
    32. debug1: SSH2_MSG_SERVICE_REQUEST sent
    33. debug1: SSH2_MSG_SERVICE_ACCEPT received
    34. debug1: Authentications that can continue: publickey,password
    35. debug1: Next authentication method: publickey
    36. debug1: Trying private key: /root/.ssh/identity
    37. debug1: Trying private key: /root/.ssh/id_rsa
    38. debug1: Trying private key: /root/.ssh/id_dsa
    39. debug1: Next authentication method: password
    40. root@10.0.0.19's password:
    41. =======>老男孩老师评:这里就是提示输入密码的交互提示。 Nike Air Max Thea Femme Rose
    42. Air Max 2017 Nero Donna
    43. debug1: Authentication succeeded (password).
    44. debug1: channel 0: new [client-session]
    45. debug1: Entering interactive session.
    46. debug1: Sending environment.
    47. debug1: Sending env LANG = en_US.UTF-8
    48. Last login: Tue Sep 24 10:30:02 2013 from 10.0.0.18

    在远程连接时如果慢就可以确定卡在哪了。 Adidas Superstar Femme Noire Wisconsin Badgers

    1. [root@C64_A ~]# ssh -v oldboy@10.0.0.17
    2. OpenSSH_5.3p1, OpenSSL 1.0.0-fips 29 Mar 2010
    3. debug1: Reading configuration data /etc/ssh/ssh_config
    4. debug1: Applying options for *
    5. debug1: Connecting to 10.0.0.17 [10.0.0.17] port 22.
    6. debug1: Connection established.
    7. debug1: permanently_set_uid: 0/0
    8. debug1: identity file /root/.ssh/identity type -1
    9. debug1: identity file /root/.ssh/id_rsa type -1
    10. debug1: identity file /root/.ssh/id_dsa type 2
    11. debug1: Remote protocol version 2.0, remote software version OpenSSH_5.3
    12. debug1: match: OpenSSH_5.3 pat OpenSSH*
    13. debug1: Enabling compatibility mode for protocol 2.0
    14. debug1: Local version string SSH-2.0-OpenSSH_5.3
    15. debug1: SSH2_MSG_KEXINIT sent
    16. debug1: SSH2_MSG_KEXINIT received
    17. debug1: kex: server->client aes128-ctr hmac-md5 none
    18. debug1: kex: client->server aes128-ctr hmac-md5 none
    19. debug1: SSH2_MSG_KEX_DH_GEX_REQUEST(1024<1024<8192) sent
    20. debug1: expecting SSH2_MSG_KEX_DH_GEX_GROUP
    21. debug1: SSH2_MSG_KEX_DH_GEX_INIT sent
    22. debug1: expecting SSH2_MSG_KEX_DH_GEX_REPLY
    23. debug1: Host '10.0.0.17' is known and matches the RSA host key.
    24. debug1: Found key in /root/.ssh/known_hosts:2
    25. debug1: ssh_rsa_verify: signature correct
    26. debug1: SSH2_MSG_NEWKEYS sent
    27. debug1: expecting SSH2_MSG_NEWKEYS
    28. debug1: SSH2_MSG_NEWKEYS received
    29. debug1: SSH2_MSG_SERVICE_REQUEST sent
    30. debug1: SSH2_MSG_SERVICE_ACCEPT received
    31. debug1: Authentications that can continue: publickey,gssapi-keyex,gssapi-with-mic,password
    32. debug1: Next authentication method: gssapi-keyex
    33. debug1: No valid Key exchange context
    34. debug1: Next authentication method: gssapi-with-mic

    上述配置没配就发现卡到gssapi这。 adidas nmd enfants adidas superstar dziecięce 就大概知道是gssapi的问题。 nike air max 1 print donna air max 2017 heren 实际上在linux系统优化部分就应该优化SSH服务的此处。

    Posted in Linux | Leave a comment