UNIX网络编程卷一 第一章 简介
来源:互联网 发布:java sftp 文件夹同步 编辑:程序博客网 时间:2024/05/16 12:42
写这个博客主要是为了加深记忆和更好的消化学习过的内容,博客内容并非完全照搬书本,同时也是学习一章写一章,因此很可能存在理解错误的地方。欢迎读者指出讨论。
这一章主要通过一个简单的时间获取程序的客户端和服务端的程序展开分析,通过这两个程序我们需要了解客户端和服务端进行套接字编程需要用到的套接字api。
客户端版本:
#include "unp.h"
int
main(int argc, char **argv)
{
int sockfd, n;
char recvline[MAXLINE + 1];
struct sockaddr_inservaddr;
//int count=0;
if (argc != 2)
err_quit("usage: a.out <IPaddress>");
if ( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
err_sys("socket error");
}
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(9999);/* daytime server */
if (inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0)
err_quit("inet_pton error for %s", argv[1]);
if (connect(sockfd, (SA *) &servaddr, sizeof(servaddr)) < 0)
err_sys("connect error");
while ( (n = read(sockfd, recvline, MAXLINE)) > 0) {
//printf("read %d\n", n);
//count++;
recvline[n] = 0;/* null terminate */
if (fputs(recvline, stdout) == EOF)
err_sys("fputs error");
}
//printf("count = %d\n", count);
if (n < 0)
err_sys("read error");
exit(0);
}
主要步骤如下:
1. 调用sockket 接口创建一个套接字, 返回套接字描述符, 后续的套接字相关操作都是基于该描述符。
2. 调用connect 接口连接到服务器。 这里需要先配置好sockaddr_in结构的一个变量,该变量描述服务器信息,包括域、IP, 端口号。这个函数会阻塞直到收到服务器响应, 约75S后超时。
3. 连接成功后进进入阻塞读状态。read返回0表示读完所有数据了, 为负数表示read出错。
服务端程序:
#include "unp.h"
#include <time.h>
int
main(int argc, char **argv)
{
int listenfd, connfd;
struct sockaddr_inservaddr;
char buff[MAXLINE];
time_t ticks;
listenfd = Socket(AF_INET, SOCK_STREAM, 0);
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(9999);/* daytime server */
Bind(listenfd, (SA *) &servaddr, sizeof(servaddr));
Listen(listenfd, LISTENQ);
for ( ; ; ) {
connfd = Accept(listenfd, (SA *) NULL, NULL);
ticks = time(NULL);
snprintf(buff, sizeof(buff), "%.24s\r\n", ctime(&ticks));
{
int i;
for (i = 0; i < strlen(buff); i++)
{
Write(connfd, &buff[i], 1);
printf("send: %c\n", buff[i]);
}
}
Close(connfd);
}
}
主要步骤如下:
1. 调用socket创建一个套接字。
2. 调用 bind 接口 建立套接字与本地IP/端口号绑定。
3. 调用listen 接口。调用完listen之后,服务器准备工作已经完成,可以接收客户端的connect了。这里也可以设置监听链接路数的最大值。
4. 调用 accept 接收客户端的连接。 这个步骤完成后TCP链接已经成功建立,可以开始传输数据。
5. write 数据到套接字中。
6. 主动关闭TCP链接。 主动关闭链接的一端最后会进入TIME_WAIT状态,持续2MSL。
以上2个程序包含了TCP连接的整个过程(建立TCP链接,通信,关闭TCP链接),关于其中更多细节在下一章分析。
- UNIX网络编程卷一 第一章 简介
- UNIX网络编程卷一 笔记 第一章 简介
- UNIX 网络编程 卷一:套接字联网API(第3版) 读书笔记(1) 第一章 简介
- UNIX网络编程 UNP 卷2 第一章
- 《UNIX网络编程卷1》读书笔记--第一章 简介和TCP/IP
- 《UNIX网络编程 卷2》 笔记: 简介
- UNIX网络编程卷一:第一章 简单的客户端服务器程序
- 《Unix 网络编程》学习笔记 第一章:简介
- Unix 网络编程卷一- 学习笔记
- unix网络编程(卷一)--安装源码
- 【计算机网络】《unix网络编程卷一》读书笔记
- unix 网络编程 卷一(unp.h)
- Unix网络编程卷一笔记
- 学习《UNIX网络编程卷一》笔记
- UNIX网络编程卷一 笔记 第三章 套接字编程简介
- UNIX网络编程卷一:第三章 套接字编程简介
- 《Unix网络编程卷1》笔记(1):第一章简介——使用Cygwin运行示例代码
- UNIX网络编程 第一章
- Dubbo与Zookeeper、SpringMVC整合和使用(负载均衡、容错)
- 第五节 html文字列表
- Android 不能退出的解释(android.os.Process.killProcess(android.os.Process.myPid()))
- UVa 133 The Dole Queue(圈的下标处理)
- 常见的DOS命令行总结
- UNIX网络编程卷一 第一章 简介
- 怎样设计合适的接口
- hive拉链表和增量表
- Video4Linux框架简介(5) - 控制框架
- postgres拷贝指定数据
- 1st round, 200 number of isalnds
- Android开发自定义水印图片
- android 利用ViewDragHelper实现childView可随手指移动的自定义ViewGroup
- char *指向的内容不可修改