UNIX∕Linux系统与软件开发环境(本科)指导书.doc_第1页
UNIX∕Linux系统与软件开发环境(本科)指导书.doc_第2页
UNIX∕Linux系统与软件开发环境(本科)指导书.doc_第3页
UNIX∕Linux系统与软件开发环境(本科)指导书.doc_第4页
UNIX∕Linux系统与软件开发环境(本科)指导书.doc_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

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

文档简介

河南城建学院Linux系统应用与编程UNIX系统与软件开发课程设计指导书班 级 08141212 专 业 计算机科学与技术 实习类别 课程设计 时 间 第6学期 1617周 指导教师 邵国金 郭猛 郝伟 计算机科学与工程学院2015年5月20日一、MySql数据库在Unix/Linux C的使用Linux MySql数据库开发MySql与C联合开发开发库的安装MySql C API编程实例1、软件包需要1)MySql服务器mysql-server-3.23.54a-11mysql-server-3.23.58-1.92)MySql客户端mysql-3.23.54a-11mysql-3.23.58-1.93)MySql开发接口库mysql-devel-3.23.54a-11mysql-devel-3.23.58-1.92、Mysql服务配置l mysqyld服务要运行起来。最好是设为开机自动启动。方法:l chkconfig level 2345 mysqld onl ntsysvl service mysqld start / stop /restartl 图形方式3、Msqyl客户端命令行工具MySqyl客户端命令行工具为mysql。其常用法为:mysql OPTIONS database output.tab常用参数有:-?, -help:帮助-D, -database=DB_name:指定数据库-h, -host=Host_name:指定主机-u, -user=DB_user_name:指定用户-p, -password=:指定密码4、客户端常用命令在命令提示符下输入:mysql 或 mysql u root进入mysql系统。提示符为“”,可以使用的命令有:show databases / tables;use database;create database db;create table tbl;drop database db/ table tbl;select from tbl where insert into tbl values update tbl set where delete from tbl where 4、MySql C开发接口不同版本的MySql有不同的目录设置。1)头文件目录:/usr/include/mysql使用:#include 说明:必要时可使用-I参数2)库文件静态库:/usr/lib/mysql/libmysqlclient.a动态库:/usr/lib/mysql/libmysqlclient.so使用参数:-L/usr/lib/mysql -lmysqlclient3)mysql C开发示例程序/头文件#include#includemain()/变量声明MYSQLmysql; MYSQL_RES*result;MYSQL_ROWrow;/ 初始化数据结构mysql_init(&mysql); /连接数据库mysql_real_connect(&mysql,localhost,root,0,mydb,0,NULL,0); /执行查询语句mysql_querymysql_query(&mysql,SELECT * FROM person);/保存结果result=mysql_store_result(&mysql);/处理结果集while(row=mysql_fetch_row(result)fprintf(stdout,%s|t%sn,row0,row2);mysql_free_result(result); /清理数据 mysql_close(&mysql); /关闭连接4)编译和链接方法编译链接时要使用-L和-l参数。例如:cc -o mysql mysql.c -L/usr/lib/mysql -lmysqlclient5)开发接口说明Mysql提供有多种开发接口:PHP,ODBC,PERL,C/C+,JAVAC常用的开发接口有:mysql_init,mysql_real_connect,mysql_query,mysql_store_result,mysql_fetch_row,mysql_free_result,mysql_close,mysql_init(1)mysql_init作用:是初始化MYSQL变量,为mysql_real_connect()做准备。用法:MYSQL *mysql_init(MYSQL *mysql) 返回值:MYSQL句柄或描述符;内存不足是为NULL;(2)mysql_real_connect功能:链接mysql数据库;用法:MYSQL *mysql_real_connect(MYSQL *mysql,const char *host, const char *user,const char *passwd, const char *db,unsigned int port, const char *unix_socket,unsigned int client_flag)说明:如果port!=0,则将作为TCP/IP端口使用,默认为0;如果unix_socket!=NULL,则可指定socket或命名PIPE,默认为NULL;Client_flag可以指定特定的值(略),默认为0.(3)mysql_query功能:查询实施用法:int mysql_query(MYSQL *mysql, const char *query) 说明:query为数据库操作命令字符串,本义是查询(select),可包括select,update,insert,delete等对数据库操作的命令。mysql_query不能用来处理二进制数据,处理二进制数据可使用mysql_real_query。返回值:0表示正常,非0表示发生了错误。(4)mysql_store_resul功能:结果集处理。如果使用mysql_query运行的是一个SELECT语句,或其它可以返回结果的查询,可用函数mysql_store_result来访问返回结果并并将其保存在一个变量中,以便做进一步处理。用法:MYSQL_RES *mysql_store_result(MYSQL *mysql)MYSQL_RES *mysql_use_result(MYSQL *mysql)说明:mysql为mysql_real_connect函数的返回值。(5)结果集的使用使用了mysql_store_result函数保存结果后,可以使用以下函数对结果集进行处理。获得结果集中的行数:my_ulonglong mysql_num_rows(MYSQL_RES *result)获得结果集行的域字段数:unsigned int mysql_num_fields(MYSQL_RES *result)unsigned int mysql_num_fields(MYSQL *mysql)读取结果集中的一行:MYSQL_ROW mysql_fetch_row(MYSQL_RES *result)获取结果集中行的域段数:unsigned int mysql_field_count(MYSQL *mysql)获得结果集中的域的属性:MYSQL_FIELD *mysql_fetch_field(MYSQL_RES *result)获得域属性数组:MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *result)查询被update、delete、insert等受影响的行:my_ulonglong mysql_affected_rows(MYSQL *mysql) (6)善后工作当对数据库使用完毕后,应对所创建的变量等进行释放:mysql_free_result(result);mysql_close(&mysql);(7)错误处理方法有2:利用函数的返回值来判断函数执行是否正确;2.使用mysql提供的错误号和错误信息:错误号:unsigned int mysql_errno(MYSQL *mysql)错误信息:char *mysql_error(MYSQL *mysql)(8)辅助函数获取客户机版本信息:char *mysql_get_client_info(void)获取主机信息:char *mysql_get_host_info(MYSQL *mysql)获取协议版本信息:unsigned int mysql_get_proto_info(MYSQL *mysql)获取服务器版本信息:char *mysql_get_server_info(MYSQL *mysql) 获取可用数据库列表:MYSQL_RES *mysql_list_dbs(MYSQL *mysql, const char *wild)获取数据库的可有表列表:MYSQL_RES *mysql_list_tables(MYSQL *mysql, const char *wild)6)数据库访问示例(1)MySQL数据库操作在shell提示符下运行mysql命令,实现以下操作:查询当前的数据库信息mysqlSHOW DATABASES;查询数据库mysql中的表mysqlSHOW TABLES from mysql;创建数据库studentsmysqlCREATE DATABASE students;Query OK, 1 row affected (0.00 sec)可再次查询数据库mysqlSHOW DATABASES;打开数据库mysqlUSE students;创建stds和marks两个表mysqlCREATE TABLE stds (id char(19) not null,clschar(10) not null,u_nochar(12) default ,unmchar(10) not null,sexchar(2) not null,bthdate not null);mysql CREATE TABLE marks (id char(19) not null key,engdec(3.2) default 0.0,chndec(3.2) default 0.0,mathdec(3.2) default 0.0);Query OK, * rows affected (0.00 sec)查询当前数据库中的表mysql SHOW TABLES;分别向两个表中插入数据mysqlINSERT INTO stds-(id,cls,u_no,unm,sex,bth) values-061410001,0614100101,Zhang San,F,20080101),-061411002,0614110102,Li Si,M,20080101);Query OK, * rows affected (0.00 sec)mysqlinsert INTO marks-(id,eng,chn,math) VALUES- 90,98,88),- 95,96,87);分别查询stds和marks表中的数据mysql select id,cls,u_no,unm from stds;mysql select * from marks; 批处理以上的执行过程可以整理成脚本文件,我们把它命名为mysql.script,清单如图1所示。SHOW DATABASES;create DATABASE students;SHOW DATABASES;USE students;CREATE TABLE stds ( id char(19) not null key, clschar(10) not null, u_nochar(12) default , unmchar(10) not null, sexchar(2) not null, bthdate not null );CREATE TABLE marks ( id char(19) not null key, engdec(3.2) default 0.0, chndec(3.2) default 0.0, mathdec(3.2) default 0.0 );SHOW tables;INSERT INTO stds( id,cls,u_no,unm,sex,bth ) values(061410001,0614100101,Zhang San,F,20080101 ),(061411002,0614110102,Li Si,M,20080101 );insert INTO marks(id,eng,chn,math) VALUES90,98,88),95,96,87);图1 mysql.script程序清单(2)数据库编程MySQL C API简单示例任务:使用MySQL C API函数编程访问MySQL数据库。要求:a. 建立使用MySQL C API函数编程框架;b. 查询students数据库user表中的所有信息。设程序名为mysql1.c,清单如图2所示。/ 0 头文件#include#include main() / 1 定义并初始化数据库对象/ 1.1 变量声明 MYSQLmysql; MYSQL_RES *result; MYSQL_ROW row; int i;/ 1.2 初始化数据对象 mysql_init(&mysql); / 2 建立与MySQL数据库的链接 mysql_real_connect(&mysql,localhost,root,0,students,0,NULL,0); / 3操作数据库(执行查询语句mysql_query) mysql_query(&mysql,SELECT * FROM stds);/ 4 取得并保存结果集 result=mysql_store_result(&mysql);/ 5 使用结果集 while(row=mysql_fetch_row(result) / 从结果集中得到一行 for(i=0;imysql_num_fields(result);i+) printf(%s| ,rowi); / 显示行 printf(n); / 6 善后处理 mysql_free_result(result); / 清理数据/ 7 关闭连接 mysql_close(&mysql); 图2 mysql1.c程序清单程序的编译和执行方法如下:$ gcc mysql1.c -o mysql1 -L/usr/lib/mysql -lmysqlclient# Fedora Linux$ gcc mysql1.c -o mysql1 -L/usr/lib64/mysql -lmysqlclient# Fedora 64位系统$ ./mysql1具有错误控制的C程序程序mysql1.c中没有进行错误控制,设添加错误控制的程序为mysql2.c,清单如图2所示。#include#include/ 0 头文件#includemain()/ 1 定义并初始化数据对象/ 1.1 变量声明 MYSQLmysql; MYSQL_RES *result; MYSQL_ROW row; int i;/ 1.2 初始化数据对象 if(mysql_init(&mysql)=NULL) fprintf(stderr,Error in mysql_init!n); exit(1); / 2 建立与MySQL数据库的链接 if(!mysql_real_connect(&mysql,localhost,root,0,students,0,NULL,0) fprintf(stderr,Error in connection: %s %dn, mysql_error(&mysql),mysql_errno(&mysql); mysql_close(&mysql); exit(2); / 3操作数据库(执行查询语句mysql_query) if(mysql_query(&mysql,SELECT * FROM stds)!=0) fprintf(stderr,Error in query: %s %dn, mysql_error(&mysql),mysql_errno(&mysql); mysql_close(&mysql); exit(3); / 4 取得并保存结果集 if(result=mysql_store_result(&mysql)=NULL) fprintf(stderr,Error in store_result: %s %dn, mysql_error(&mysql),mysql_errno(&mysql); mysql_free_result(result);mysql_close(&mysql); exit(4); ;/ 5 使用结果集 while(row=mysql_fetch_row(result) / 从结果集中得到一行 for(i=0;imysql_num_fields(result);i+) printf(%s| ,rowi); / 显示行 printf(n); / 6 善后处理 mysql_free_result(result); / 清理数据/ 7 关闭连接 mysql_close(&mysql); 图2 mysql2.c程序清单 MySQL C API编程示例图1和图2所示程序给出了通过C API访问MySQL数据库的框架,也给出了错误和漏洞防范的措施。但对数据库的访问不仅仅是查询,而且还有很多,比如插入、修改、删除等方面的工作。使用C API和MySQL数据库进行编程中,常见情况的简单的示范程序如下所示。任务:使用MySQL C API编程操作MySQL数据库,实现:a. 若students数据库不存在则创建之;b. 若marks表不存在而先创建之;c. 向marks表中添加一条记录:(id,eng,chn,math) 90,98,88)d. 将刚添加的记录的语文(chn)和数学(math)分别修改为95和80;e. 从键盘接收接收一条记录并将其添加的marks表。数据库students中的stds和marks表结构如图1所示。为了缩短篇幅,这里只将以上所有任务按照先后实施的过程记录下来,形成程序。设程序名为mysql3.c,清单如图3所示。#include#include#include/ 0 定义数据char *db=students,*tbl=marks;/数据库名,表名main() MYSQLmysql; MYSQL_RES*result; MYSQL_ROWrow; int i; /临时变量 char SQL500; /数据库名,表名,SQL命令串/1 初始化数据库对象 if(mysql_init(&mysql)=NULL) /若失败 fprintf(stderr,mysql_init: %sn,mysql_error(&mysql); exit(1); /2 链接默认数据库 if(!mysql_real_connect(&mysql,localhost,root,0,0,NULL,0)/失败 fprintf(stderr,mysql_connect: %sn,mysql_error(&mysql); exit(2); /3 检测db是否已经存在.若不存在则创建之/3.0 查询本数据库db信息 result=mysql_list_dbs(&mysql,db); /列数据库信息,以判断数据库db是否存在 if(mysql_num_rows(result)=0) /若不存在则创建之/3.1 构造命令串 sprintf(SQL,CREATE DATABASE %s;,db); /构造创建数据库命令串/3.2 创建数据库 if(mysql_query(&mysql,SQL)!=0) /若创建失败 fprintf(stderr,%s: %sn,SQL,mysql_error(&mysql); exit(3); /3.3 显示受影响的行数(以下略) printf(%lu raw(s) affectedn,mysql_affected_rows(&mysql);/4 关闭与默认数据库链接,然后再重新初始化,为以后使用db做准备 mysql_close(&mysql); /关闭 if(mysql_init(&mysql)=NULL) /重新初始化失败 fprintf(stderr,mysql_init: %sn,mysql_error(&mysql); exit(4); /5 链接数据库db if(!mysql_real_connect(&mysql,localhost,root,0,db,0,NULL,0) fprintf(stderr,mysql_connect: %sn,mysql_error(&mysql); exit(5); /6 检测表tbl是否存在.若不存在则创建之/6.0 查询表tbl信息 result=mysql_list_tables(&mysql,tbl); if(mysql_num_rows(result)=0) /若不存在/6.1 构造创建表的SQL命令串 sprintf(SQL,CREATE TABLE %s (%s %s %s %s);, tbl, id char(20) not null key,eng numeric(6,2), chn numeric(6,2),math numeric(6,2);/ 6.2 创建表 if(mysql_query(&mysql,SQL)!=0) /若失败 fprintf(stderr,%s: %sn,SQL,mysql_error(&mysql); exit(6); / 7 插入记录:90,98,88) sprintf(SQL,INSERT INTO %s (id,eng,chn,math) VALUES 90,98,88);,tbl); if(mysql_query(&mysql,SQL)!=0) /若失败 fprintf(stderr,%s: %sn,SQL,mysql_error(&mysql); exit(7); /8 修改90,98,88)为90,95,80) sprintf(SQL,UPDATE %s SET chn=95,math=80 WHERE id,tbl); if(mysql_query(&mysql,SQL)!=0) /若失败 fprintf(stderr,%s: %sn,SQL,mysql_error(&mysql); exit(8); /9 从键盘读入一个记录,并将其插入到表中 char id20; float eng,chn,math; printf(Please a record link this: id eng chn math: ); scanf(%s %f %f %f,id,&eng,&chn,&math); sprintf(SQL,INSERT INTO %s (id,eng,chn,math) VALUES (%s,%3.2f,%3.2f,%3.2f);,tbl,id,eng,chn,math); if(mysql_query(&mysql,SQL)!=0) /若失败 fprintf(stderr,%s: %sn,SQL,mysql_error(&mysql); exit(9); /10 善后处理: 释放资源,关闭数据库链接 mysql_free_result(result); /释放资源 mysql_close(&mysql); /关闭数据库链接 exit(0); /正常结束,返回0图3 mysql3.c程序清单由mysql3.c可以看出,用C API处理MySQL数据库并不困难,关键要根据实际的任务构造SQL命令,然后再通过mysql_query()去执行SQL语句就可以了,但是不要忘记通过mysql_query()的返回值来判断任务的完成情况,以控制各种意外情况的发生。二、Unix Socket网络编程1、守候进程守候进程(daemon),也叫精灵进程,或服务器进程,是生存期长的一种进程。它们常常在系统引导装入时起动,在系统关闭时终止。因为它们没有控制终端,所以说它们是在后台运行的。2、客户机/服务器(C/S)模型一般而言,服务器是一个进程,它等待客户机与其联系,提出某种类型的服务要求。C/S模式(结构如图4所示)在操作过程中采取的是主动请求方式。服务对客户机服务可将结果或信息返回给客户机(双向),也可不返回(单向)。就双向C/S来讲,又分为重复型和并发型两种。在网络编程中,一般来说,TCP服务器是并发的,而UDP服务器是重复的。图4 C/S结构模型1)重复型重复型服务器通过以下步骤进行交互:(1)打开一通信通道并告知本地主机,它愿意在某一公认地址端口上接收客户请求。(2)等待一个客户请求的到来;(3)处理客户请求;(4)将服务结果数据发送给请求的客户;(5)返回步骤(2)重复型服务器主要的问题发生在第(3)步。在这期间,它不能接收其它客户请求,因而不能为其他客户机提供服务。2)并发型并发型服务器采用以下步骤进行交互:(1)打开一通信通道并告知本地主机,它愿意在某一公认地址端口上接收客户请求。(2)等待一个客户请求的到来;(3)启动一个新的服务器来处理这个客户的请求。启动一个新的服务器的方法可能不同,可能是生成一个新的进程或线程,这依赖于所使用的操作系统或开发系统的支持。新生成的服务器对客户的全部请求进行处理。处理完毕后,终止这个新服务器。(4)返回步骤(2)并发服务器的优点在于它是利用生成其他服务器的方法来处理客户的请求。它可以同时并发地为多个客户机服务。3)客户方(1)打开一通信通道,并连接到服务器所在主机的特定端口。(2)向服务器发服务请求,等待并接收应答;(3)请求结束后关闭通信通道。3、socket的引入socket程序库是UNIX网络上最普及的API,可调用socket程序库提供的各个程序开发网络软件和网络系统。TCP/IP协议被集成到UNIX内核中时,相当于在UNIX系统引入了一种新型的I/0操作。UNIX用户进程与网络协议的交互作用比用户进程与传统的I/O设备相互作用复杂得多。在UNIX系统中,网络应用编程界面有两类:UNIX BSD的套接字(socket)和UNIX System V的TLI。由于Sun公司采用了支持TCP/IP的UNIX BSD操作系统,使TCP/IP的应用有更大的发展,其网络应用编程界面(套接字)在网络软件中被广泛应用。 4、套接字类型 流式套接字(SOCK-STREAM):提供了一个面向连接、可靠的数据传输服务,数据无差错、无重复地发送,且按发送顺序接收。内设流量控制,避免数据流超限;数据被看作是字节流,无长度限制。文件传送协议(FTP)即使用流式套接字。数据报式套接字(SOCK-DGRAM) :提供了一个无连接服务。数据包以独立包形式被发送,不提供无错保证,数据可能丢失或重复,并且接收顺序混乱。原始式套接字(SOCK-RAW):该接口允许对较低层协议,如IP、ICMP直接访问。常用于检验新的协议实现或访问现有服务中配置的新设备。5、基本套接字系统调用 创建套接字socket() 地址绑定bind() 建立连接connect()与accept()监听连接listen() 数据传输send()/write()与recv()/read() 关闭套接字close() 1)创建套接字socket() 应用程序在使用套接字前,必须拥有一个套接字,系统调用socket()向应用程序提供创建套接字的手段。其调用格式如下:#includeint socket(int domain, int type, int protocol);该调用要接收3个参数,根据这3个参数建立一个套接字,并将相应的资源分配给它,同时返回一个整型套接字号,只和一个特定的协议相联系。实际上指定了相关五元组中的“协议”这一元。domain(协议族):AF_INET,AF_UNIX,AF_IPX,type(类型):SOCK_STREAM,SOCK_DGRAMprotocol(协议):0-让系统使用指定类型和协议族上的默认协议。2)绑定本地地址bind()当一个套接字用socket()创建后,存在一个名字空间(地址族),但它没有被命名,bind()将套接字地址(包括本地主机地址和本地端口地址)与所创建的套接字号绑定起来,即将名字赋予套接字,以指定本地半相关。其调用格式如下:#include int bind(int sockfd,const struct sockaddr *my_addr, int addrlen);说明:sockfd:为socket成功时的返回值套接字描述符。my_addr为本方地址数据结构。addrlen=sizeof(my_addr).3)监听连接listen() 此调用用于面向连接服务器,表明它愿意接收连接。1isten()需在accept()之前调用,其调用格式如下:#includeint listen(int s,int backlog);listen()在执行调用过程中可为没有调用过bind()的套接字s完成所必需的连接,并建立长度为backlog的请求连接队列。backlog定义最大长度的socket等待队列。默认值为5. 4)connect(),accept()这两个系统调用用于完成一个完整相关的建立,其中connect()用于客户建立连接。accept()用于使服务器等待来自某客户进程的实际连接。(1)connect功能:客户方调用发出的请求用法:int connect(int sockfd,const structct sockaddr * server_addr, socklen_t addrlen); 在面向连接的协议中,该调用导致本地系统和外部系统之间连接实际建立。 (2)accept功能:服务器调用,从等待从编号为s的套接字上接受客户连接请求。用法:int accept(int s, struct sockaddr *addr, socklen_t addrlen); (3)connect与accept的说明调用accept()后,服务器等待从编号为s的套接字上接受客户连接请求,连接请求是由客户方的connect()调用发出的。当有连接请求到达时,accept()调用将请求连接队列上的第一个客户方套接字地址及长度放入addr和addrlen,并创建一个与s有相同特性的新套接字号。新的套接字可用于处理服务器并发请求。 5)数据传输:send()/write与recv()/read() 当一个连接建立以后,就可以传输数据了。常用的系统调用有send()和recv()。send()调用用于在参数s指定的已连接的数据报或流套接字上发送输出数据,格式如下:int send(int s,void *buf,int len,int flags);int recv(int s,void *buf,int len,int flags); recv/send可由文件系统调用read/write所取代。在处理二进制数据处理时,后者优于前者。6)关闭套接字:close()close()关闭套接字s,并释放分配给该套接字的资源;如果s涉及一个打开的TCP连接,则该连接被释放。close()的调用格式如下:int close(int s);6、字节顺序网络字节顺序:TCP/IP使用大端字节来传输协议信息。大端(尾)数(big-endian)把高位字节放在低地址,而小尾(端)数(little-endian)则把高位字节存放在高地址空间。需要在机器字节顺序与网络字节顺序转换的可使用下列函数:unsignd int htonl(unsigned int hostlong)unsignd short htons(unsigned int hostshort)unsignd int nhtonl(unsigned int netlong)unsignd int nhtons(unsigned int netshort)前两个是正向的,后两者是反向的。这时里的“长整数”指的是32位,而不是C语言的长整数。7、地址转换应用程序常常需要在点分十进制的IP与二进制形式IP间的转换。以下函数可以实现这种转换:#include #include #includeint inet_aton(const char *ddaddress, struct in_addr *adress)char *inet_ntoa(struct in_addr address);unsigned long int inet_addr(const char *ddaddress);8、主机信息及相关数据结构和函数struct hostent char*h_name;/ Official name of hostchar*h_aliases;/ Alias list. inth_addrtype;/ Host address typeinth_length;/ Length of addresschar*h_addr_list;/ List of addrs from NS;参见netdb.h主机信息及相关数据结构和函数#includestruct hostent *gethostbyname(const char *name)name:为主机名。可以是域名,也可在/etc/hosts中定义。struct hostent *gethostbyadress(const char *addr, int len, int type)addr::是一个指向in_addr的结构(见netinet/in.h);len指明addr的长度;type:对于SCOK_STREAM,type为AF_INET。9、服务器端相关的数据结构和函数struct servent char*s_name;/ Official service name.char*s_aliases;/ Alias s_port;/ Port number. char*s_proto;/ Protocol to use.;参见netdb.h10、服务器端相关的数据结构和函数#includestruct servent *getservbyname(const char *name, const char *protocal);name与protocal均定义在/etc/services中:name:服务名;protocal:为协议struct servent *getservbyport(int port, const char *protocal);直接使用数字作为端口号,建议不要这样做,因为不便配置。IP socket地址#include#includestructsockaddr_in short intsin_family;/ AF_INETunsigned short int sin_port;/ port No.struct in_addrsin_addr;/ IP addr.11、典型套接字调用过程服务器方客户方socket()建立服务方套接字sbind(s)绑定本地地址和端口listen(s)准备接收连接请求accept(s)等待客户方连接

温馨提示

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

评论

0/150

提交评论