欢迎 stonege 加入本站!
 免费注册  用户登陆  汇款方式  汇款确认  产品报价  联系我们  帮助中心
加入收藏
设为首页
会员体系
申请VIP
网站首页 光盘超市 软件下载 技术文章 专题 用户中心 VIP会员 网站留言 娱乐中心 卓越资源 源代码
今天是:2009年07月05日 星期日  您现在位于: 首页 → 技术文章 → Unix环境C语言编程(8...
   Unix环境C语言编程(8)
作者:  出处:Unix爱好者家园unix-cd.com  更新时间: 2005年11月04日 
第八章 网络编程

8.1 概述

本章介绍UNIX网络编程-即网间进程通讯。UNIX网间进程通讯是通过通讯应用程序接口(API)来实现的。目前,在UNIX环境下最流行的API是伯克利套接字(Socket)和UNIX System V的传送层接口(TLI)。我们主要介绍套接字API。

Socket通过域 (domain)来划分所支持的协议, 目前支持的域有: UNIX域支持在UNIX系统中的进程通讯、Internet域支持TCP/IP协议等。 Socket的实现者试图以UNIX文件的操作语义来模拟进程通讯的操作,其操作方式与文件操作有许多对应。例如,socket( )调用可近似的看成是open( )调用,调用返回的文件描述字作为其他调用的第一参数;socket 中也使用了read 和write 调用,其语法和语义与文件操作中的read 和 write 调用几乎完全一致。Socket中的调用 bind、connect和accept 显示了建立网络连接的方法。 如图8-1所示。Socket进程通讯仍使用Client/Server 模型,建立连接时,Client 和 Server 所做的工作是不对称的。

8.2 套接字编程接口说明

下面结合实例来说明套接字编程接口。

·socket系统调用
实现套接字的分配,调用格式如下:
#include <sys/types.h>
#include <sys/socket.h>
int socket(int domain, int type, int protocol);
其中:参数domain是一个常量,它规定区域,常用的是AF_INET;参数type是一个常量,规定套接字的类型,可以是SOCK_STREAM,SOCK_DGRAM或SOCK_RAW;protocol是一个常量,规定所用的协议。此参数仅在type为SOCK_RAW时有意义,其他情况下忽略。此参数为0时选择默认协议。

·bind系统调用
当应用程序获得套接字后,可以使用bind()调用为套接字联系一个独一无二的名字,如下面一段代码:
struct sockaddr_in serverAddress ;
memset( (char *)&serverAddress , 0 , sizeof(struct sockaddr_in) ) ;
serverAddress.sin_family =AF_INET ;
serverAddress.sin_addr.s_addr =inet_addr("202.96.6.15") ;
serverAddress.sin_port = htons( 7000);
if( bind( sockfd , &serverAddress ,sizeof( struct sockaddr_in ) ) ==-1 )
{
perror( "bind error" ) ;
exit( 2 ) ;
}

这段代码说明SERVER程序运行在IP地址202.96.6.15,端口号为7000上。Bind调用之后相当于将自己的服务地址公布出去。
bind的调用格式如下:
#include <sys/types.h>
#include <sys/socket.h>
int bind (int s, const struct sockaddr *name, int namelen);

其中:参数s是socket调用返回的文件描述字,参数name是指向结构sockaddr的指针,参数namelen指定结构的大小。

·listen系统调用
在bind调用之后,SERVER程序使用listen调用来准备接收来自CLIENT的连接。listen的调用格式如下:
#include <sys/types.h>
#include <sys/socket.h>
int listen (int s, int backlog);
其中:参数s是socket调用返回的文件描述字,参数backlog指定最大连接数。

·accept系统调用
在listen调用之后,SERVER程序使用accept调用实际接收来自CLIENT的连接请求。accept的调用格式如下:
#include <sys/types.h>
#include <sys/socket.h>
int accept (int s, struct sockaddr *addr, int *addrlen);
其中:参数s是socket调用返回的文件描述字,参数addr指向结构sockaddr,负责读入CLIENT端的相应信息。参数addrlen指出addr对应结构的长度。

·connect系统调用
在CLIENT方,调用socket之后,就可使用connect调用向SERVER初始化一个连接请求。如下面的代码:
struct sockaddr_in serverAddress ;
memset( (char *)&serverAddress , 0 , sizeof(struct sockaddr_in) ) ;
serverAddress.sin_family =AF_INET ;
serverAddress.sin_addr.s_addr =inet_addr("202.96.6.15") ;
serverAddress.sin_port = htons( 7000);
if( connect( sockfd , &serverAddress ,sizeof( struct sockaddr_in ) ) ==-1 )
{
perror( "bind error" ) ;
exit( 2 ) ;
}
这段代码完成了向运行在IP地址202.96.6.15,端口号为7000上的SERVER程序建立连接。
connect的调用格式如下:
#include <sys/types.h>
#include <sys/socket.h>
int connect (int s, const struct sockaddr *name, int namelen);
其中:参数s是socket调用返回的文件描述字,参数name是指向结构sockaddr的指针,参数namelen指定结构的大小。

·read/write/close系统调用
与普通文件操作类似。
 (本文已被浏览 4848 次)
 发布人:sdccf
 → 推荐给我的好友
上篇文章:Unix环境C语言编程(7)
下篇文章:Unix环境C语言编程(9)
 相关文章:
Mandriva Linux 2009 Powerpack新手入门教程 SCO OpenServer 5.0.7连上SQLSERVER2000全纪录
SCO OpenServer 5.0.7制作紧急启动光盘的方法 将SCO OpenServer 5.0.6安装到IBM X3650上
如何把一个软盘镜像HBA文件转光盘ISO格式HBA文件 SCO操作系统安装Serial ATA (SATA)硬盘的方式
ubuntu 8.04 上安装 oracle 10g sco unix 5.07 使用windows FAT 格式的USB盘过程
制作带有hpsas驱动的SCO5.0.6应急和引导光盘安装G5 联想扬天M2600C安装SCO5.0.6+Windows XP
万年历的C语言程序 Sco UNIX的核心引导过程详解
Fedora 7一共有3种类型的Live镜像 Fedora 7下玩游戏
优化Fedora 7,关掉不需要的Fedora services Linux 下 C 语言编程
C语言常见错误 在centos 5中使用xfce桌面环境
C语言中用qsort()快速排序 不使用逻辑运算求得两数的最大值

相关搜索
查看百度中关于Unix环境C语言编程(8)的更多内容
查看google中关于Unix环境C语言编程(8)的更多内容
   文章分类
操作系统 |
SCO_UNIX  Sun_Solaris  IBM_AIX  HP_UX  Linux  BSD  Tru64_UNIX 
通用UNIX知识  Windows  Minix 
程序设计 |
Shell编程  C/C++  汇编  PHP  JAVA  Perl  Python 
ASP/HTML  XML  中间件 
数据库 |
Oracle  Informix  Sybase  Fox  DB2  SQL  MySQL 
PostgreSQL 
网络应用 |
网络应用 
计算机硬件 |
计算机主机  打印机  路由器  交换机  终端  磁带机  MO 
刻录机  终端服务器  调制解调器 
   文章评论
  → 评论内容 (点击查看)   共0条评论,每页显示5条评论   浏览所有评论
(没有相关评论)
  → 发表我的评论
您的姓名: 您的Email:
评论内容:
250字内
发表评论:      发表评论须知 →
  • 尊重网上道德,遵守《全国人大常委会关于维护互联网安全的决定》及中华人民共和国其他各项有关法律法;
  • 本站有权保留或删除您发表的任何评论内容;
  • 关于我们 ┋  网站留言 ┋  网站地图 ┋  友情链接 ┋  与我在线 ┋  汇款确认 ┋  管理 ┋  TOP
    Unix爱好者家园  http://www.unix-cd.com/
    联系我们:sdccf@163.com
    腾讯QQ: 7644599
    备案序号:鲁ICP备05000455号
    Copyright (c) 2001-2008 Unix-cd.com. All Rights Reserved.