tcp41.c

来自「Linux网络编程配套源代码 不过看的时候最好和书籍一起配套看」· C语言 代码 · 共 66 行

C
66
字号
/* 服务器端程序 */

#include <stdio.h>

#include <errno.h>

#include <signal.h>

#include <sys/types.h>

#include <sys/socket.h>



struct sockaddr myname;

char buf[80];

main()

{

  int sock, new_sd, adrlen, cnt;

  sock = socket(AF_UNIX, SOCK_STREAM, 0);		/* 套接字的建立 */

  if (sock < 0) {

    printf("server socket failure %d\n", errno);

    perror("server: ");

    exit(1);  }

  myname.sa_family = AF_UNIX;

  strcpy(myname.sa_data, "/tmp/billb");

  adrlen = strlen(myname.sa_data) + sizeof(myname.sa_family);

  unlink("/tmp/billb");  /* defensive programming */

  if (bind(sock, &myname, adrlen) < 0) {

    printf("server bind failure %d\n", errno);

    perror("server: ");

    exit(1);  }

  if (listen(sock, 5) < 0) {		/* listen函数调用 */

    printf("server listen failure %d\n", errno);

    perror("server: ");

    exit(1);  }  



  /* 忽略子进程的终止  */

  signal (SIGCHLD, SIG_IGN);

  /*  将服务器置于死循环状态,等待客户端的连接请求的到来。

      实际上,应该用更好的办法来结束这个死循环,在这里这

      个循环是被连接开始信号或者是超级用户终止的。     */



  while (1) {

    if (new_sd = accept(sock, &myname, &adrlen) < 0) {

      printf("server accept failure %d\n", errno);

      perror("server: ");

      exit(1);    }



    /* 建立服务器端子进程。此时父进程将不再运行

       --它返回循环状态等待下一个连接请求     */



    printf("Socket address in server %d is %x, %s\n",

      getpid(), myname.sa_data, myname.sa_data);



    if (fork() == 0) {  /* 建立子进程 */

      close (sock);  /* 关闭套接字,因为子进程不再需要它  */

      /*  . . . . .  */



      cnt = read(new_sd, buf, strlen(buf));

      /* read函数读取套接字缓冲区中的数据到应用缓冲区*/

      printf ("Server with pid %d got message %s\n", getpid(), buf);

      strcpy (buf, "Message to client");

      cnt = write(new_sd, buf, strlen(buf));

      printf("Socket address in server %d is %x, %s\n",

        getpid(), myname.sa_data, myname.sa_data);

      /*  . . . . .  */

      close (new_sd); /* close prior to exiting  */

      exit(0);

    }   

  }  

}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?