socket编程教学课件_第1页
socket编程教学课件_第2页
socket编程教学课件_第3页
socket编程教学课件_第4页
socket编程教学课件_第5页
已阅读5页,还剩48页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Socket编程

培训思路:

■Socket是什么玩意

■咋使用和设计Socket进行通信

socket概述

linux中的网络编程通过socket接口实现。Socket

既是一种特殊的10,它也是一种文件描述符。

一个完整的Socket都有一个相关描述{协议,

本地地址,本地端口,远程地址,远程端口};

每一个Socket有一个本地的唯一Socket号,

由操作系统分配。

文件描述符

■内核(kernel)利用文件描述符(file

descriptor)来访问文件。文件描述符是

非负整数。打开现存文件或新建文件时,

内核会返回一个文件描述符。读写文件

也需要使用文件描述符来指定待读写的

文件

常见套接字有二种类型:

流式套接字(SOCK_STREAM)

■流式的套接字可口提供可靠的、面向连接的

通讯流。它使用了TCP协议。TCP保证了数据

传输的正确性和顺序性。

■数据报套接字(SOCK_DGRAM)

■数据报套接字定义?一种无连接的服务,数

据通过相互独立的报文进行传输,是无序的,

并且不保证可靠,无差错。使用数据报协议

UDP协议。

如何使用和设计Socket进行通信

■Socket的建立、配置、连接、数据传输、

结束

■以上的主要步骤由socket函数实现

Socket函数介绍

需要用到的头文件

■数据类型:ttinclude<sys/types.h>

■函数定义:ttinclude<sys/socket.h>

Socket常用函数列表

■网络连接函数

■获取/设置socket的参数或信息

■转换函数

网络连接函数

■socket

■bind

■connect

■listen

■accept

■select

■recv,recvfrom

■send,sendto

■close,shutdown

获取/设置socket的参数或信息

■gethostbyaddr,gethostbyname

■gethostname

■getpeername

■getprotobyname,getprotobynumber

■getservbyname,getservbyport

■getsockname

■getsockopt,setsockopt

■ioctl

转换函数

■IP地址转换

■inet_addr()

■inet_ntoa()

-字节顺序转换

■htonsO-"HosttoNetworkShort"

■htonl()-"HosttoNetworkLong"

■ntohs()-"NetworktoHostShort"

■ntohl()-"NetworktoHostLong"

数据结构:sockaddr

structsockaddr{

unsignedshortsa_family;/*addressfamily,

AF_xxx*/

charsa_data[14];/*14bytesof

protocoladdress

*/

);

此数据结构用做bind、connect、recvfrom>

sendto等函数的参数,指明地址信息

数据结构:sockaddrjn

structsockaddrjn{

shortintsin_family;/*Addressfamily*/

unsignedshortintsin_port;/*Portnumber*/

structinaddrsinaddr;/*Internetaddress*/

unsignedcharsin_zero[8];/*Samesizeas

structsockaddr*/

);

该结构与sockaddr兼容,供用户填入参数

数据结构:inaddr

structin_addr{

unsignedlongs_addr;

这个数据结构是由于历史原因保留下来的,主

要用作与以前的格式兼容。

structsockaddrjnmy_addr;

my_addr.sin_family=AF_INET;

my_addr.sin_port=htons(3490);/*short,

NBO*/

my_addr.sin_addr.s_addr=inet_addr("0");

bzero(&(my_addr,sin_zero)78);

注意:sin_addr.s_addr填本机IP,如果此项填

INADDR_ANY时,表示自动取本机IP填入该项(仅

用于Server)

函数简介:socket

■Socket描述符与Linux中的文件描述符类似,也

是一个int型的变量

-函数调用:

■intsocket(intdomain,inttype,intprotocol);

-函数返回Socket描述符,返回-1表示出错

■domain参数只能取AF」NET,protocol参数一般取0

■应用示例:

-TCP:sockfd=socket(AF_INETzSOCK_STREAMzO);

-UDP:sockfd=socket(AF_INET,SOCK_DGRAMzO);

函数简介:bind

■作为Server程序,需要与一个端口绑定

intbind(intsockfd,structsockaddr*my_addr,

intaddrlen);

bind函数返回-1表示出错,最常见的错误是该

端口已经被其他程序绑定。

需要注意的一点:在Linux系统中,1024以下的

端口只有拥有root权限的程序才能绑定

函数简介:listen

■开始监听已经绑定的端口

-需要在此前调用bind。函数,否则由系统指定一个

随机的端口

■intlisten(intsockfd,intqueuejength);

■接收队列

-一个新的Client的连接请求先被放在接收队列中,

等待Server程序调用accept函数接受连接请求

■queue_length指的就是接收队列的长度

也就是在Server程序调用accept函数之前最大允许的连接请

求数,多余的连接请求将被拒绝

函数简介:accept

■accept。函数将响应连接请求,建立连接

■产生一个新的socket描述符来描述该连接

■这个连接用来与特定的Client交换信息

■intaccept(intsockfd,structsockaddr*addr,int

*addrlen);

■addr将在函数调用后被填入连接对方的地址

信息,如对方的IP、端口等。

■accept缺省是阻塞函数,阻塞直到有连接请求

函数简介:connect

连接某个Server

intconnect(intsockfd,structsockaddr*servaddr,

intaddrlen);

■servaddr是事先填写好的结构,Server的IP和端口都

在该数据结构中指定。

函数简介:recv

用于TCP协议中接收信息

intrecv(intsockfd,void*buf,intlen,intflags);

-buf,对向容纳接收信息的缓冲区的指针

■len,缓冲区的大小

■flags,接收标志

■函数返回实际接收的字节数,返回-1表示出错

■recv缺省是阻塞函数,直到接收到信息或出错

函数简介:send

用于TCP协议中发送信息

intsend(intsockfd,constvoid*msg,intlen,int

flags);

-msg,指向待发送信息的指针

-len,待发送的字节数

-flags,发送标志

■函数返回已发送的字节数,返回-1表示出错

■send缺省是阻塞函数,直到发送完毕或出错

-注意:如果函数返回值与参数len不相等,则剩

余的未发送信息需要再次发送

函数简介:close

■关闭特定的socket连接

■调用函数:intclose(intsockfd);

-关闭连接将中断对该socket的读写操作。

■关闭用于listen。函数的socket将禁止其

他Client的连接请求

函数简介:shutdown

■Shutdown。函数可以单方面的中断连接,

即禁止某个方向的信息传递。

-函数调用

■intshutdown(intsockfd,inthow);

■参数how:

0-禁止接收信息

]-禁止发送信息

2-晶收和发il嬴被禁止,与dose()函数效果相同

■返回。表示调用成功,返回-1表示出错

函数简介:inetaddr,inet_ntoa

unsignedlonginet_addr(constchar*cp);

■inet_addr将一个点分十进制IP地址字符串转换

成3万位数字表示的IP地址

char*inet_ntoa(structin_addrin);

■inejntoa将一个32位数字表示的IP地址转换

成点分十进制IP地址字符串

这两个函数互为反函数

TCP:基于连接流的网络协议

■TCP相关的函数

■Server的例子

■Client的例子

■Server-Client结构图

TCP应用举例

Server部分

Server程序的作用

■程序初始化

■持续监听一个固定的端口

■收到Client的连接后建立一个socket连接

■与Client进行通信和信息处理

-接收Client通过socket连接发送来的数据,

进行相应处理并返回处理结果,如BBS

Server

■通过socket连接向Client发送信息,

如TimeServer

■通信结束后中断与Client的连接

一个简单的TCPServer

完整的Server程序不例

程序流程一

■取得socket描述符:

intsockfd;

sockfd=socket(AFJNET,SOCK_STREAM,

0);

程序流程二

■填写自身地址信息的sockaddr_in结构

structsockaddrjnmy_addr;/*自身的地

址信息*/

my_addr.sin_family=AF_INET;

/*网络字节顺序*/

my_addr,sin_port=htons(MYPORT);

/*百动填本机IP*/

my_addr.sin_addr.s_addr=INADDR_ANY;

/*其余部分置0*/

bzero(&(my_addr.sin_zero),8);

程序流程三

■绑定端口

bind(sockfd,(structsockaddr*)&my_addr,

sizeof(structsockaddr));

程序流程四

■监听端口

#defineBACKLOG10

listen(sockfd,BACKLOG);

程序流程五

-接受连接请求

intnew_fd;/*数据端口*/

structsockaddrjntheir_addr;/*连接对方的

地址信息*/

intsinsize;

sin_size=sizeof(structsockaddrjn);

new_fd=accept(sockfd,(structsockaddr

*)&their_addr,&sin_size))

程序流程六

■产生新进程(线程)处理读写socket

if(!fork()){/*子进程7

if(send(new_fd,"Hello,world!\n",14,0)==

-1)perror("sendn);

close(new_fd);

exit(0);

close(new_fd);

程序流程七

-转程序流程五,继续等待其他Client的连

接并处理

#include<stdio.h>

#ihclude<stdlib.h>

#iiclude<ermo.h>

#1Elude<string.h>

^wlude<sys/types.h>

#include<netinet/in.h>

#include<sys/socket.h>

#include<sys/wait.h>

#defineMYPORT3490/*监听端口*/

#defineBACKLOG10/*listen的请求接收队列长度*/

voidmain()

(

intsockfd,newfd;/*监听端口,数据端口*/

structsockaddrinmy_addr;/*自身的地址信息*/

structsockaddrintheiraddr;/*连接对方的地址信息*/

intsin_size;

if((sockfd=socket(AF_INET,SOCKSTREAM,0))==-1){

perror(nsocketn);

exit(l);

myaddr.sinfamily=AFINET;

myaddr.sin_port=htons(MYPORT);/*网络字节顺序*/

myaddr.sinaddr.saddr=INADDRANY;/*自动填本机IP*/

bzero(&(my_addr.sin_zero),8);/*其余部分置0*/

if(bind(sockfd,(structsockaddr*)&my_addr,

sizeofifstructsockaddr))==-1){

perror(nbindn);

exit(l);

}

if(listen(sockfd,BACKLOG)==-1){

perror(nlistenu);

exit(l);

while(l){/*主循环*/

sinsize=sizeof(structsockaddrin);

newfd=accept(sockfd,(structsockaddr*)&their_addr,&sin_size))

]if(new_fd==-1)(

[perror("acceptn);

continue;

}

printff^Gotconnectionfrom%s\n",inet_ntoa(their_addr.sinaddr));

if(!fork()){/*子进程*/

if(send(new_fd,nHello,world!'n",14,0)==-1)perror(nsendn);

close(newfd);

exit(0);

}

close(newfd);/*无法生成子进程时有用*/

while(waitpid(-1,NULL,WNOHANG)>0);/*清除所有子进程*/

TCP应用举例

Client部分

Client程序的作用

-程序初始化

■连接到某个Server上,建立socket连接

■与Server进行通信和信息处理

■接收Server通过socket连接发送来的数据,

进行相应处理

■通过socket连接向Server发送请求信息

■通信结束后中断与Client的连接

一个简单的TCPClient

完整的Client程序示例

程序流程一

■取得socket描述符:

intsockfd;

sockfd=socket(AFJNET,SOCK_STREAM,

0);

程序流程二

・填写连接对方的地址信息的sockaddjin结构

structhostent*he;

structsockaddrjntheir_addr;/*对方的地址

信息*/

he二gethostbyname("");

their_addr.sin_family=AF_INET;

their_addr.sin_port=htons(4000);/*short,NBO

*/

their_addr.sin_addr="((structin_addr*)he-

>h_addr);

bzero(&(their_addr.sin_zero),8);/*其余部分设置成

0*/

程序流程三

■连接端口

connect(sockfd,(structsockaddr

*)&their_addr,sizeof(struct

sockaddr));

程序流程四

■读写socket

程序流程五

■关闭socket

close(sockfd);

#include<stdio.h>

^include<stdlib.h>

^include<ermo.h>

^include<string.h>

Hnclude<netdb.h>

#include<sys/types.h>

#include<netinet/in.h>

#include<sys/socket.h>

#definePORT3490/*Server的端口*/

#defineMAXDATASIZE100/*一次可以读的最大字节数*/

intmain(intargc,char*argv[])

(

intsockfd,numbytes;

charbufIMAXDATASIZE];

structhostent*he;/*主机信息*/

structsockaddrintheiradd;/*对方地址信息*/

if(argc!=2){

fprintffstderr,"usage:clienthostname\nn);

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论