⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 32.htm

📁 unix高级编程原吗
💻 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 + -