版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年度广告发布合同标的及投放范围3篇
- 顾问劳务合同
- 酒店布草洗涤服务合同
- 设备吊装服务合同
- 2024版购物中心商户服务支持合同2篇
- 2024年度教育培训项目内部承包合同3篇
- 二零二四年仓储租赁中介服务合同3篇
- 室内装饰装修合同(示范文本)
- 2024年度版权侵权赔偿合同2篇
- 二零二四年度任城区人才公寓租住合同终止与解除条款2篇
- 2025年国家外汇管理局中央外汇业务中心招聘25人笔试备考试题及答案解析
- 雨雪冰冻天气应急预案(30篇)
- 校园周边接送交通管理制度
- 青岛大学《民法总论》2022-2023学年第一学期期末试卷
- 专题05三角函数与解三角形(选择填空题)(原卷版)
- 外研版三起小学四年级英语下册教案全册表格式
- 燃气管道等老化更新改造项目可行性研究报告
- 部编版语文初一上学期期末试卷与参考答案(2024-2025学年)
- 城市印象-德阳
- 2024年消防月全员消防安全知识专题培训-附20起典型火灾案例
- 公务员2023年国考《申论》(副省卷)题和参考答案
评论
0/150
提交评论