Linux的编程网络编程TCP.docx
- 文档编号:28000177
- 上传时间:2023-07-07
- 格式:DOCX
- 页数:11
- 大小:98.09KB
Linux的编程网络编程TCP.docx
《Linux的编程网络编程TCP.docx》由会员分享,可在线阅读,更多相关《Linux的编程网络编程TCP.docx(11页珍藏版)》请在冰豆网上搜索。
Linux的编程网络编程TCP
14.Linux的编程:
网络编程:
TCP
服务器程序
服务器端图解
相关系统调用
socket
#include
#include
intsocket(intdomain,inttype,intprotocol);
功能:
为通信创建一个端点
domain:
选择使用的协议族,对于TCP/IP网络,使用AF_INET
type:
选择通信类型,TCP通信时,使用SOCK_STREAM;UDP通信时,使用SOCK_DGRAM
protocol:
说明要使用的协议,通常为0,因为前两个参数决定了没有可选项。
bind
#include
#include
intbind(ints,conststructsockaddr*address,size_taddress_len);
功能:
将套接口与端口绑定
s:
由socket调用创建的套接口描述符
address:
指明端口信息
address_len:
端口信息结构长度
端口信息结构体:
structsockaddr_in{
shortsin_family;//设为AF_INET,表示TCP/IP通信
u_shortsin_port;//要绑定的端口号
structin_addrsin_addr;//s_addr域设为INADDR_ANY,允许任何主机的连接请求。
charsin_zero[8];//用于填充,使sockaddr_in与sockaddr一样大
}
listen
#include
#include
intlisten(ints,intbacklog)
功能:
指定允许的客户连结数的最大值
s:
套接口描述符。
backlog:
允许的最大客户连接数。
accept
#include
#include
intaccept(ints,structsockaddr*address,int*address_len);
功能:
在套接口s上等待连接请求,接受一个连接请求后把客户端信息存入address指向的结构,返回一个新的描述符用于在这个连接上通信。
address_len,为sockaddr结构的长度。
客户端信息包括IP地址和端口号。
服务器端的准备过程
socket->bind->listen->accept
源程序
/*server.c
*CopyrightMarkWatson1999.OpenSourceSoftwareLicense.
*/
#include
#include
#include
#include
#include
intport=8000;
voidmain(){
structsockaddr_insin;
structsockaddr_inpin;
intsock_descriptor;
inttemp_sock_descriptor;
intaddress_size;
charbuf[16384];
inti,len;
//建立套接口
sock_descriptor=socket(AF_INET,SOCK_STREAM,0);
if(sock_descriptor==-1){
perror("calltosocket");
exit
(1);
}
bzero(&sin,sizeof(sin));
sin.sin_family=AF_INET;
sin.sin_addr.s_addr=INADDR_ANY;
sin.sin_port=htons(port);
//与端口绑定
if(bind(sock_descriptor,(structsockaddr*)&sin,sizeof(sin))==-1){
perror("calltobind");
exit
(1);
}
//设置最大连接数
if(listen(sock_descriptor,20)==-1){
perror("calltolisten");
exit
(1);
}
printf("Acceptingconnections...\n");
while
(1){
//等待客户连接请求
temp_sock_descriptor=
accept(sock_descriptor,(structsockaddr*)&pin,
&address_size);
if(temp_sock_descriptor==-1){
perror("calltoaccept");
exit
(1);
}
//接收信息
if(recv(temp_sock_descriptor,buf,16384,0)==-1){
perror("calltorecv");
exit
(1);
}
printf("receivedfromclient:
%s\n",buf);
//forthisserverexample,wejustconvertthe
//characterstouppercase:
//转为大写
len=strlen(buf);
for(i=0;i //发送回去 if(send(temp_sock_descriptor,buf,len,0)==-1){ perror("calltosend"); exit (1); } //关闭连接 close(temp_sock_descriptor); } } 客户程序 相关系统调用 socket 同上 connect #include #include intconnect(ints,structsockaddr*address,size_taddress_len); 功能: 将本机套接口s与adress指定的服务器进行连接。 客户端的准备过程 socket->connect recv intrecv(intsocket,void*buf,intbuf_len,unsignedintflags) 功能: 从连接socket中接收信息,存入buf指向的区域,buf_len指定区域大小,flag一般取0 send intsend(intsocket,constvoid*message_data,intmessage_data_length,unsignedintflags); 功能: 向连接socket发送消息,消息内容存于message_data指向的区域,message_data_length指出消息长度,flags一般置0 gethostbyname #include structhostent*gethostbyname(constchar*name) 功能: 将主机名转换为Internet地址 name可以是主机域名,可以是IP地址 hostent中包含可能查出主机使用的多个IP地址,用内部形式表示 源程序 /*client.c *CopyrightMarkWatson1999.OpenSourceSoftwareLicense. *Note: derivedfromNLPserverclientexample. *Seeforall *ofthenaturallanguageserver(NLPserver)sourcecode. */ #include #include #include #include #include char*host_name="127.0.0.1";//localhost intport=8000; voidmain(intargc,char*argv[]){ charbuf[8192]; charmessage[256]; intsocket_descriptor; structsockaddr_inpin; structhostent*server_host_name; char*str="Adefaultteststring"; if(argc<2){ printf("Usage: test\"Anyteststring\"\nWewillsendadefaultteststring.\n"); }else{ str=argv[1]; } if((server_host_name=gethostbyname(host_name))==0){ perror("Errorresolvinglocalhost\n"); exit (1); } bzero(&pin,sizeof(pin)); pin.sin_family=AF_INET; pin.sin_addr.s_addr=htonl(INADDR_ANY); pin.sin_addr.s_addr=((structin_addr*)(server_host_name->h_addr))->s_addr;//填入主机IP地址信息 pin.sin_port=htons(port);//填入网络字节序的端口号 //建立套接口 if((socket_descriptor=socket(AF_INET,SOCK_STREAM,0))==-1){ perror("Erroropeningsocket\n"); exit (1); } //与服务器建立连接 if(connect(socket_descriptor,(void*)&pin,sizeof(pin))==-1){ perror("Errorconnectingtosocket\n"); exit (1); } printf("Sendingmessage%stoserver...\n",str); if(send(socket_descriptor,str,strlen(str),0)==-1){ perror("Errorinsend\n"); exit (1); } printf("..sentmessage..waitforresponse...\n"); if(recv(socket_descriptor,buf,8192,0)==-1){ perror("Errorinreceivingresponsefromserver\n"); exit (1); } printf("\nResponsefromserver: \n\n%s\n",buf); close(socket_descriptor); } 执行结果 多进程的服务器 源程序? ? ? ? 多线程的服务器 源程序? ? ? ?
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Linux 编程 网络 TCP