1.什么是TCP/IP、UDP? 2.Socket在哪里呢? 3.Socket是什么呢? 4.有很多的框架,为什么还在从Socket开始? 5.LinuxCSocket简单示例 1.什么是TCP/IP、UDP? TCP/IP(TransmissionControlProtocol/InternetProtocol)即传输控制协议/网间协议,是一个工业标准的协议集,它是为广域网(WANs)设计的。 UDP(UserDataProtocol,用户数据报协议)是与TCP相对应的协议。它是属于TCP/IP协议族中的一种。 下面的图表明了这些协议的关系。 2.Socket在哪里呢? 3.Socket是什么呢? Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。 门面模式,用自己的话说,就是系统对外界提供单一的接口,外部不需要了解内部的实现。 4.有很多的框架,为什么还在从Socket开始? 现在的跨平台网络编程框架很多,如Java的SSH,C/C++的Boost等。 现在的分布式框架很多,如Hadoop等。 我的任务是把一个C/C++程序做成分布式,要求的不配环境,基本属于纯计算的,结果很小。所以选择了Socket。 重要的是Socket是分布式、云计算、网络编程的基础,对Socket的学习有利于对其他框架的理解。 下图是Socket编程的基本流程: 5.LinuxCSocket简单实例与详细注释 程序为简单的“回射”,客户端将控制台输入的信息发送给服务器端,服务器原样返回信息。 服务器端: 1#includesys/types.h 2#includesys/socket.h 3#includestdio.h 4#includenetinet/in.h 5#includearpa/inet.h 6#includeunistd.h 7#includestring.h 8#includestdlib.h 9#includefcntl.h 10#includesys/shm.h 11 12#defineMYPORT 13#defineQUEUE20 14#defineBUFFER_SIZE 15 16intmain() 17{ 18///定义sockfd 19intserver_sockfd=socket(AF_INET,SOCK_STREAM,0); 20 21///定义sockaddr_in 22structsockaddr_inserver_sockaddr; 23server_sockaddr.sin_family=AF_INET; 24server_sockaddr.sin_port=htons(MYPORT); 25server_sockaddr.sin_addr.s_addr=htonl(INADDR_ANY); 26 27///bind,成功返回0,出错返回-1 28if(bind(server_sockfd,(structsockaddr*)server_sockaddr,sizeof(server_sockaddr))==-1) 29{ 30perror(bind); 31exit(1); 32} 33 34///listen,成功返回0,出错返回-1 35if(listen(server_sockfd,QUEUE)==-1) 36{ 37perror(listen); 38exit(1); 39} 40 41///客户端套接字 42charbuffer[BUFFER_SIZE]; 43structsockaddr_inclient_addr; 44socklen_tlength=sizeof(client_addr); 45 46///成功返回非负描述字,出错返回-1 47intconn=accept(server_sockfd,(structsockaddr*)client_addr,length); 48if(conn0) 49{ 50perror(connect); 51exit(1); 52} 53 54while(1) 55{ 56memset(buffer,0,sizeof(buffer)); 57intlen=recv(conn,buffer,sizeof(buffer),0); 58if(strcmp(buffer,exit\n)==0) 59break; 60fputs(buffer,stdout); 61send(conn,buffer,len,0); 62} 63close(conn); 64close(server_sockfd); 65return0; 66} 客户端: 1#includesys/types.h 2#includesys/socket.h 3#includestdio.h 4#includenetinet/in.h 5#includearpa/inet.h 6#includeunistd.h 7#includestring.h 8#includestdlib.h 9#includefcntl.h 10#includesys/shm.h 11 12#defineMYPORT 13#defineBUFFER_SIZE 14 15intmain() 16{ 17///定义sockfd 18intsock_cli=socket(AF_INET,SOCK_STREAM,0); 19 20///定义sockaddr_in 21structsockaddr_inservaddr; 22memset(servaddr,0,sizeof(servaddr)); 23servaddr.sin_family=AF_INET; 24servaddr.sin_port=htons(MYPORT);///服务器端口 25servaddr.sin_addr.s_addr=inet_addr(.0.0.1);///服务器ip 26 27///连接服务器,成功返回0,错误返回-1 28if(connect(sock_cli,(structsockaddr*)servaddr,sizeof(servaddr))0) 29{ 30perror(connect); 31exit(1); 32} 33 34charsendbuf[BUFFER_SIZE]; 35charrecvbuf[BUFFER_SIZE]; 36while(fgets(sendbuf,sizeof(sendbuf),stdin)!=NULL) 37{ 38send(sock_cli,sendbuf,strlen(sendbuf),0);///发送 39if(strcmp(sendbuf,exit\n)==0) 40break; 41recv(sock_cli,recvbuf,sizeof(recvbuf),0);///接收 42fputs(recvbuf,stdout); 43 44memset(sendbuf,0,sizeof(sendbuf)); 45memset(recvbuf,0,sizeof(recvbuf)); 46} 47 48close(sock_cli); 49return0; 50} 执行: 客户端 服务器端 如何治疗白癜风土方治白癜风的药转载请注明原文网址:http://www.gzdatangtv.com/jsyy/6468.html |