网络学习二

一个服务器发送给客户端的时间的客户端代码以及详解

  • 代码展示
  • 代码详解

代码展示

#include "unp.h"
int main(int argc, char *argv[])
{

    int sockfd,n,count = 0;
    char recvline[MAXLINE+1];
    struct sockaddr_in servaddr;
    if(argc != 2) {
        fprintf(stderr, "usage: client \n");
        exit(1);
    }
    if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
        fprintf(stderr , "socker error\n");
        exit(1);
    }
    bzero(&servaddr, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_port = htons(PORT);
    if(inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0) {
    fprintf(stderr, "inet_pton error for %s\n", argv[1]);
        exit(1);  
    }
    if(connect(sockfd,(SA *) &servaddr, sizeof(servaddr)) < 0) {
          fprintf(stderr, "connect error\n");
          exit(1);
    }
    while((n = read(sockfd, recvline, MAXLINE)) > 0) {
          ++ count;
          recvline[n] = 0;
          if(fputs(recvline, stdout) == EOF) {
              fprintf(stderr, "fputs error\n");
              exit(1);
          }
    }
    printf("recvline %d times\n", count);
    if(n < 0) {
        fprintf(stderr, "read error\n");
        exit(1);
    }
    return 0;
}

代码详解

(sockfd = socket(AF_INET, SOCK_STREAM, 0)) socket函数创建一个网际(AF_INET)字节流(SOCK_STREAM)套接字,它是TCP套接字的花哨名字。该函数返回一个小整数描述符,以后的所有函数调用就用该描述符来标识这个套接字。

套接字(socket):网络编程的API之一,是应用层到传输层或其他协议层的访问接口。其次具体使用的套接口是与Unix管道的某一端类似的东西,既可以往这个“口”写东西,也可以从这个"口"读数据。最后,套接口函数使用套接口描述字,访问具体的套接口。如果把套接口描述字的简称sockfd加做“套节字”比较合适,一个套接口可以对应多个套接字。

接下来把servaddr初始化,整个结构清0.使用了htons和inet_pton将参数转化为合适的格式
接下来的connect就是连接服务器,三次握手就在这里完成的。,接下来的read读取服务器的应答。

一个服务器发送给客户端的时间的服务器代码以及详解

  • 代码展示
  • 代码详解

代码展示

#include "unp.h"
#include 
int main(int argc, char *argv[])
{
   int listenfd,connfd;
   struct sockaddr_in servaddr;
   char buff[MAXLINE+1];
   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(PORT);
   bind(listenfd, (SA *) &servaddr, sizeof(servaddr));
   listen(listenfd, LISTENQ);
   while(1){
      connfd = accept(listenfd, (SA *)NULL, NULL);
      ticks = time(NULL);
      snprintf(buff, sizeof(buff), "%.24s\r\n", ctime(&ticks));
      write(connfd, buff, strlen(buff));
      close(connfd);
  }
  exit(0);
  return 0;
}

代码详解

这里的 bind(listenfd, (SA *) &servaddr, sizeof(servaddr)); 套接字与本地的端口相连,
Listen监听端口消息,接下来服务器进程在accept调用中被投入睡眠,等待某个客户连接的到达,并被内核接收,TCP连接使用三次握手来建立。握手完毕是会返回一个连接描述符,这个连接描述符用于与新连接的那个客户通信。write 给客户端发送消息。close 关闭与该客户端的连接。

你可能感兴趣的:(网络学习二)