UNIX网络编程卷一 第一章 简介
2017-02-10 11:57
246 查看
写这个博客主要是为了加深记忆和更好的消化学习过的内容,博客内容并非完全照搬书本,同时也是学习一章写一章,因此很可能存在理解错误的地方。欢迎读者指出讨论。
这一章主要通过一个简单的时间获取程序的客户端和服务端的程序展开分析,通过这两个程序我们需要了解客户端和服务端进行套接字编程需要用到的套接字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
= 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链接),关于其中更多细节在下一章分析。
这一章主要通过一个简单的时间获取程序的客户端和服务端的程序展开分析,通过这两个程序我们需要了解客户端和服务端进行套接字编程需要用到的套接字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
= 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链接),关于其中更多细节在下一章分析。
相关文章推荐
- OSGi原理与最佳实践:第一章 OSGi框架简介(2)
- 第一章 设备驱动程序简介
- 第一章:systemverilog简介
- Unix/Linux下的Curses库开发指南——第一章 Curses库开发简介
- 第一章 redis简介
- 《.net编程先锋C#》第一章 C#简介
- HTML5秘籍---第一章(HTML5简介)
- 第一章 Crystal Reports简介
- 8.HBase In Action 第一章-HBase简介(1.2.2 捕获增量数据)
- UNP《网络编程》笔记 第一章 简介
- 《Unix 网络编程》学习笔记 第一章:简介
- 【UNIX网络编程读书笔记】第一章 简介和TCP/IP(程序之后的笔记)
- 第一章 vagrant简介--The Tao of Vagrant(4)
- 跟我一起学MiniOA:第一章 1.2 Javaserver Faces 简介(连载)
- 第一章 consul简介
- 第一章 Web MVC简介 —— 跟开涛学SpringMVC
- python 教程 第一章、 简介
- linux内核设计与实现【第三版】摘记----第一章:linux内核简介
- 第一章 dubbo简介
- 第一章 Shiro简介——《跟我学Shiro》