📄 32.htm
字号:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>CTerm非常精华下载</title>
</head>
<body bgcolor="#FFFFFF">
<table border="0" width="100%" cellspacing="0" cellpadding="0" height="577">
<tr><td width="32%" rowspan="3" height="123"><img src="DDl_back.jpg" width="300" height="129" alt="DDl_back.jpg"></td><td width="30%" background="DDl_back2.jpg" height="35"><p align="center"><a href="http://apue.dhs.org"><font face="黑体"><big><big>123</big></big></font></a></td></tr>
<tr>
<td width="68%" background="DDl_back2.jpg" height="44"><big><big><font face="黑体"><p align="center"> ● UNIX网络编程 (BM: clown) </font></big></big></td></tr>
<tr>
<td width="68%" height="44" bgcolor="#000000"><font face="黑体"><big><big><p align="center"></big></big><a href="http://cterm.163.net"><img src="banner.gif" width="400" height="60" alt="banner.gif"border="0"></a></font></td>
</tr>
<tr><td width="100%" colspan="2" height="100" align="center" valign="top"><br><p align="center">[<a href="index.htm">回到开始</a>][<a href="17.htm">上一层</a>][<a href="33.htm">下一篇</a>]
<hr><p align="left"><small>发信人: cloudsky (晓舟·轩辕明月), 信区: Linux <br>
标 题: 网络socket编程(1) <br>
发信站: 武汉白云黄鹤站 (Mon Feb 8 20:18:34 1999) , 站内信件 <br>
<br>
1. man socket <br>
cc [ flag ... ] file ... -lsocket -lnsl [ library ... ] <br>
#include <sys/types.h> <br>
#include <sys/socket.h> <br>
int socket(int domain, int type, int protocol); <br>
<br>
domain指定地址族,在Unix系统中地址族和协议族是一一对应的, <br>
事实上AF_INET和PF_INET完全一样。这里是用PF_INET, <br>
表示TCP/IP协议族。 <br>
#include <sys/socket.h> <br>
#define AF_INET 2 <br>
#define PF_INET AF_INET <br>
<br>
type目前有如下几种: <br>
SOCK_STREAM <br>
SOCK_DGRAM <br>
SOCK_RAW <br>
SOCK_STREAM对应TCP协议,带外数据传输机制被支持。 <br>
SOCK_DGRAM对应UDP协议。 <br>
SOCK_RAW提供对internal network interfaces的访问,只有特权 <br>
程序才能使用。对应IP协议、ICMP协议等等。 <br>
<br>
protocol指定用于这个socket的特定的协议。一般在特定的协议族 <br>
特定的type下对应了单一的protocol。然而如多协议存在, <br>
则必须明确指定。man getprotoent看看。 <br>
/etc/protocols文件。/usr/include/netinet/in.h文件。 <br>
/* Protocols */ <br>
#define IPPROTO_IP 0 /* dummy for IP */ <br>
#define IPPROTO_ICMP 1 /* control message protocol */ <br>
#define IPPROTO_IGMP 2 /* group control protocol */ <br>
#define IPPROTO_GGP 3 /* gateway^2 (deprecated) */ <br>
#define IPPROTO_ENCAP 4 /* IP in IP encapsulation */ <br>
#define IPPROTO_TCP 6 /* tcp */ <br>
#define IPPROTO_EGP 8 /* exterior gateway protocol */ <br>
#define IPPROTO_PUP 12 /* pup */ <br>
#define IPPROTO_UDP 17 /* user datagram protocol */ <br>
#define IPPROTO_IDP 22 /* xns idp */ <br>
#define IPPROTO_HELLO 63 /* "hello" routing protocol */ <br>
#define IPPROTO_ND 77 /* UNOFFICIAL net disk proto */ <br>
#define IPPROTO_EON 80 /* ISO clnp */ <br>
#define IPPROTO_RAW 255 /* raw IP packet */ <br>
#define IPPROTO_MAX 256 <br>
<br>
若返回-1表示失败,否则返回一个socket号。 <br>
<br>
可以通过setsockopt和getsockopt来控制socket的某些特性。 <br>
<br>
2. man bind <br>
int bind(int s, const struct sockaddr *name, int namelen); <br>
成功则返回0,返回-1表示失败,更多的信息在全局变量errno中指定。 <br>
<br>
s 即socket函数返回的socket号 <br>
struct sockaddr { <br>
u_short sa_family; /* address family */ <br>
char sa_data[14]; /* up to 14 bytes of direct address */ <br>
}; <br>
对于TCP/IP协议来说:/usr/include/netinet/in.h <br>
struct sockaddr_in { <br>
short sin_family; /* 总是AF_INET */ <br>
u_short sin_port; /* 2个字节,用网络字节顺序表示端口号 */ <br>
struct in_addr sin_addr; /* 4个字节,用网络字节顺序表示IP地址 */ <br>
char sin_zero[8]; /* 未用 */ <br>
}; <br>
}; <br>
struct in_addr { <br>
union { <br>
struct { u_char s_b1, s_b2, s_b3, s_b4; } S_un_b; <br>
struct { u_short s_w1, s_w2; } S_un_w; <br>
u_long S_addr; /* 32bitIP地址,网络字节顺序 */ <br>
} S_un; <br>
#define s_addr S_un.S_addr /* should be used for all code */ <br>
#define s_host S_un.S_un_b.s_b2 /* OBSOLETE: host on imp */ <br>
#define s_net S_un.S_un_b.s_b1 /* OBSOLETE: network */ <br>
#define s_imp S_un.S_un_w.s_w2 /* OBSOLETE: imp */ <br>
#define s_impno S_un.S_un_b.s_b4 /* OBSOLETE: imp # */ <br>
#define s_lh S_un.S_un_b.s_b3 /* OBSOLETE: logical host */ <br>
}; <br>
相当于: <br>
struct in_addr { <br>
u_long s_addr; /* 32bitIP地址,网络字节顺序 */ <br>
}; <br>
<br>
namelen = sizeof(struct sockaddr); <br>
<br>
3. man connect <br>
int connect(int s, struct sockaddr *name, int namelen); <br>
s 即socket函数返回的socket号 <br>
name 描述了连接目的地 <br>
namelen <br>
无连接socket调用connect时本机与远地机无报文交换, <br>
调用将直接从本机返回,其意义在于通知本机操作系统, <br>
将来自指定地址的数据送往本socket。 <br>
返回0表示成功,-1表示失败。 <br>
<br>
4. man accept <br>
int accept(int s, struct sockaddr *addr, int *addrlen); <br>
s 服务方socket号 <br>
addr 指向客户方struct sockaddr,该结构初始化为空,调用成 <br>
功后内容为客户方内容addrlen 所指整数初始化为0,调用成功后 <br>
对应于客户方结构长度连接请求是由客户方connect函数调用发起的。 <br>
<br>
在并发服务器方式中,主服务器fork出一个从服务器,从服务器利 <br>
用调用返回的accepted socket与客户方通信。 <br>
返回-1表示失败。成功则返回一个非负整数表示accepted socket <br>
<br>
在面向连接的通信中,客户方可以不调用bind,connect会自动完成。 <br>
在无连接通信中,客户方必须调用bind。connect主要是为面向连接通 <br>
信的客户设计的,accept则完全是为面向连接通信的服务器设计的。 <br>
connect可以用于无连接的服务器以及客户,其作用可以代替bind, <br>
但比bind功能强大。 <br>
<br>
-- <br>
我问飘逝的风:来迟了? <br>
风感慨:是的,他们已经宣战。 <br>
我问苏醒的大地:还有希望么? <br>
大地揉了揉眼睛:还有,还有无数代的少年。 <br>
我问长空中的英魂:你们相信? <br>
英魂带着笑意离去:相信,希望还在。 <br>
</small><hr>
<p align="center">[<a href="index.htm">回到开始</a>][<a href="17.htm">上一层</a>][<a href="33.htm">下一篇</a>]
<p align="center"><a href="http://cterm.163.net">欢迎访问Cterm主页</a></p>
</table>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -