初学Sockets编程(一) 基本的TCP套接字

简介:

 前段时间刚开始学习《TCP/IP Sockets编程(C语言实现) (第2版)》一书,又被告知建议先去看一下《UNIX网络编程(第一卷)》的部分内容会对理解其理论知识有所帮助,于是稍微停滞了一下。几天前所练习的实例已经有所生疏,因此为了复习这部分内容(前面所提起的第一本书第2章),此文便作为复习笔记(书本关键内容摘录),而以后各章节的学习也希望能做到及时总结和复习。

  本章示例的工作方式:客户连接服务器并发送它的数据;服务器简单地把它接收到的任何内容发送回客户并断开连接。


1.典型的TCP客户的通信步骤

⑴使用socket()创建TCP套接字

  参数涉及地址族、使用的协议,正确创建返回一个句柄。

⑵使用connect()建立到达服务器的连接

  参数涉及套接字句柄、服务器的地址结构中的地址和端口标识,其中地址结构需要强制转换为泛型类型。

⑶使用send()和recv()通信

  send()参数涉及套接字句柄、发送内容、发送长度;返回值为发送的字节数,错误返回为-1。

  recv()参数涉及套接字句柄、接收缓冲区、缓冲区大小、调用方式;返回值为接受的字节数,返回0表示另一端应用程序关闭了TCP连接,返回-1表示失败。

⑷使用close()关闭连接


示例为之前提供的下载页面的TCPEchoClient4.c。


2.基本的TCP服务器通信的常规步骤

⑴使用socket()创建TCP套接字

⑵利用bind()给套接字分配端口号

参数涉及套接字句柄、服务器的本机地址结构中的地址和端口标识,其中地址结构需要强制转换为泛型类型,如果不是非常关心所在地址可以用inaddr_any。

⑶使用listen()告诉系统允许对该端口建立连接

  参数涉及套接字句柄、最大允许连接数。

⑷反复执行以下操作

  • 调用accept()为每个客户连接获取新的套接字

  参数涉及之前的套接字句柄,创建成功后即将填写的本机地址结构,该地址结构的长度,其中地址结构需要强制转换为泛型类型,返回一个新套接字的句柄。

  • 使用send()和recv()通过新的套接字与客户通信
  • 使用close()关闭客户连接


示例为之前提供的下载页面的TCPEchoServer4.c以及TCPServerUtility.c中的HandleTCPClient()。


3.指定地址

 

⑴通用地址

struct sockaddr {
sa_family_t sa_family; //Address family (e.g.,AF_INET)
  char sa_data[14];
};  

⑵IPv4地址

 

复制代码
struct in_addr {
uint32_t s_addr;
};

struct sockaddr_in {
sa_family_t sin_family;  //Internet protocol (AF_INET)
  in_port_t sin_port;    //Address port   (16bits)
  struct in_addr sin_addr; //IPv4 address    (32bits)
  char sin_zero[8];    //Not used
};
复制代码

  ⑶IPv6地址(已按照上一篇文章更改)

复制代码
struct in_addr {
uint8_t s_addr[16];//Internet address(128bits)
};
struct sockaddr_in6 {
sa_family_t sin6_family;  //Internet protocol(AF_INET6)
  in_port_t sin6_port;    //Address port(16bits)
  uint32_t sin6_flowinfo;  //Flow information
  struct in6_addr sin6_addr;//IPv6 address (128bits)
  uint32_t sin6_scope_id;  //Scope identifier
};
复制代码

  ⑷地址转换

int inet_pton(int addressFamily, constchar*src , void*dst)
//把地址从可打印的字符串(*src)转换为数字(dst引用的地址)

constchar*inet_ntop(int addressFamily, constvoid*src, char*dst,socklen_t dstBytes)
//把地址从数字转化为可打印的形式

  ⑸获取套接字的关联地址

int getpeername(int socket, struct sockaddr *remoteAddress, socklen_t (addressLength)
int getsockname(int socket, struct sockaddr (localAddress, socklen_t (addressLength)

  4.其他

  为了便于在同一台计算机的终端上进行调试,需要先在后台执行服务器程序(参数等所有内容的最后面加一个&),再执行客户机程序,发送到127.0.0.1即可。相关调试时用到的进程操作还有ps(查看当前运行进程)、kill(关闭进程)。





本文转自五岳博客园博客,原文链接:www.cnblogs.com/wuyuegb2312/archive/2011/08/03/2126472.html,如需转载请自行联系原作者

目录
相关文章
|
网络协议
海思3559万能平台搭建:TCP客户端网口编程
海思3559万能平台搭建:TCP客户端网口编程
120 0
|
网络协议
TCP编程中的客户端与服务端的通信实现
TCP编程中的客户端与服务端的通信实现
109 0
|
网络协议 Linux 网络性能优化
Linux网络原理及编程(6)——第十六节 TCP可靠性保证的原理
你在应用层上想要发送一个信息,但是我在底层可能是通过发送多次、甚至有触发了超时重传等等。而站在用户的角度呢,你不用去管它,我传输层不管怎么发,反正最终把你的数据发出去就可以了。也就是说,应用层的传输和底层传输层的并不是一对一、一一对应的关系。
144 0
Linux网络原理及编程(6)——第十六节 TCP可靠性保证的原理
|
网络协议 安全 Linux
Linux网络原理及编程(5)——第十五节 TCP的连接(三次握手、四次挥手)
本节我们来介绍TCP连接的建立和断开。我们主要介绍两个过程、两个状态。
175 0
Linux网络原理及编程(5)——第十五节 TCP的连接(三次握手、四次挥手)
|
网络协议 Java 大数据
网络编程:socket—基于 TCP 协议编程|学习笔记
快速学习网络编程:socket—基于 TCP 协议编程
111 0
|
存储 网络协议 算法
|
网络协议 安全 测试技术
TCP 编程快速入门案例分析 | 学习笔记
快速学习 TCP 编程快速入门案例分析
133 0
TCP 编程快速入门案例分析 | 学习笔记
|
域名解析 网络协议 Unix
TCP 编程-服务器监听 | 学习笔记
快速学习 TCP 编程-服务器监听
146 0
TCP 编程-服务器监听 | 学习笔记
|
网络协议 C#
C#编程-60:简单的TCP通讯实例
C#编程-60:简单的TCP通讯实例
134 0
C#编程-60:简单的TCP通讯实例
|
网络协议 API
【从零开始的嵌入式生活】网络编程2——TCP编程
【从零开始的嵌入式生活】网络编程2——TCP编程
【从零开始的嵌入式生活】网络编程2——TCP编程