《Socket网络编程指导》.ppt
文本预览下载声明
数据传输(3) * */37 ? sendto()和recvfrom()用于在无连接的数据报socket方 式下进行数据传输。由于本地socket没有与远端机器建立连接,所以在发送数据时要指明目的地址。 ????? sendto()函数原型为: int sendto(int sockfd, const void *buf,int buflen, unsigned int flags, const struct sockaddr_in *to, int tolen); 数据传输(4) * */37 recvfrom()函数原型为: int recvfrom(int sockfd,void *buf,int buflen, unsigned int flags,struct sockaddr_in *from,int *fromlen); recvfrom()函数返回接收到的字节数,当出错时返回-1 ?结束传输 * */37 close()函数用于释放socket,停止在该socket上的任何数据操作:?????close(sockfd); ???? 也可以调用shutdown() 来关闭该socket 该函数允许只停止某个方向上的数据传输,而一个方向上的数据传输继续进行。????int shutdown(int sockfd,int how); ???参数 how允许为shutdown操作选择以下几种方式: ????0-------不允许继续接收数据 ????1-------不允许继续发送数据 ????2-------不允许继续发送和接收数据, ????shutdown在操作成功时返回0,出错时返回-1。 C/S结构 * */37 服务器端要先启动,提供相应服务: 1:打开一通信通道并告知本地主机,它愿意在某一个公认地址上接收客户请求。 2:等待客户请求到达该端口。 3:接收到服务请求,处理该请求并发送应答信号。 4:返回第二步,等待另一客户请求 5:关闭服务器。 客户端: 1、打开一通信通道,并连接到服务器所在主机的特定端口。 2、向服务器发送服务请求报文,等待并接收应答;继续提出请求…… 3、请求结束后关闭通信通道并终止。 流程图 * */37 TCP服务器端 (循环服务器) TCP客户端 socket( ) bind( ) listen( ) accept( ) socket( ) send( ) connect( ) recv( ) recv( ) send( ) close( ) close( ) UDP服务器端 UDP客户端 socket( ) bind( ) listen( ) recvfrom( ) sendto( ) socket( ) bind( ) close( ) close( ) 简单的例子 * */37 int sockfd, newsockfd,addr_len, sendnum; struct sockaddr_in my_addr, their_addr; char * msg = “welcome”; sockfd = socket( AF_INET, SOCK_STREAM, 0 ); //建立socket my_addr.sin_family = AF_INET; //选择网络类型为TCP/IP my_addr.sin_addr.s_addr = inet_addr(“22); my_addr.sin_port = htons( 8888 ); //选择端口8888 addr_len = sizeof( struct sockaddr_in); memset(my_addr.sin_zero, ‘\0’, sizeof(my_addr.sin_zero)); bind(sockfd, (struct sockaddr *)my_addr, addr_len); //绑定socket listen(sockfd,10); //监听,等待连接,等待连接队列最大长度为10 简单的例子(续) * */37 While( 1 ) { newsockfd = accept( sockfd, (struct sockaddr *)my_addr, addr_len); sendnum = send(newsockfd, msg, s
显示全部