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链接),关于其中更多细节在下一章分析。

0 0
原创粉丝点击