网络编程 socket C语言 Linux 服务端 server

这次不能老规矩,得先梳理下思路。(代码随后就上)

本文基于Linux(CentOS),使用C语言完成网络编程。

思路:
  1. 创建一个套接字(socket)。
  2. 将套接字绑定到指定的IP地址和端口。
  3. 开启套接字的监听。
  4. 接受客户端的连接。
  5. 给客户端发送消息。
  6. 接收客户端的消息。

话先不多说,直接上代码!

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <fcntl.h>
#include <netinet/in.h>
#include <netinet/tcp.h>
#include <sys/types.h>
#include <sys/socket.h>

#define SERVER_PORT 7711

int main()
{
  int serversock;
  int yes = 1;

  // 创建套接字,用于接受连接(只在服务端)
  serversock = socket(AF_INET, SOCK_STREAM, 0);
  if (serversock == -1)
  {
    perror("serversock create error");
    return -1;
  }
  setsockopt(serversock, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes));
  printf("create serversock success\n");

  // 将套接字绑定到指定的IP地址和端口,并开启监听
  struct sockaddr_in sa;
  memset(&sa, 0, sizeof(sa));
  sa.sin_family = AF_INET;
  sa.sin_port = htons(SERVER_PORT);
  sa.sin_addr.s_addr = htonl(INADDR_ANY);

  if (bind(serversock, (struct sockaddr*) &sa, sizeof(sa)) == -1)
  {
    close(serversock);
    perror("bind error");
    return -1;
  }
  if (listen(serversock, 511) == -1)
  {
    close(serversock);
    perror("listen error");
    return -1;
  }
  printf("bind and listen success\n");

  // 接受连接
  int fd;
  struct sockaddr_in sa1;
  socklen_t sa1_len = sizeof(sa1);
  fd = accept(serversock, (struct sockaddr*) &sa1, &sa1_len);  // 看下
  if (fd == -1)
  {
    close(serversock);
    perror("accept error");
    return -1;
  }
  printf("accept link success\n");

  // 向客户端发送消息
  char *msg = "Welcome to Chat!\n\0";  // test
  write(fd, msg, strlen(msg));

  // 接收客户端的消息
  fd_set fds;
  struct timeval tv;
  tv.tv_sec = 1;
  tv.tv_usec = 0;
  int ret_val = 0;

  FD_ZERO(&fds);
  while (1)
  {
    FD_SET(fd, &fds);
    ret_val = select(fd+1, &fds, NULL, NULL, &tv);
    if (ret_val == -1)  // test
    {
      perror("select error");
      break;
    }
    else if (ret_val)
    {
      char data[256];
      int read_len = 0;
      read_len = read(fd, data, sizeof(data)-1);
      data[read_len] = 0;
      printf("%s", data);
    }
  }

  // 关闭连接释放资源
  FD_ZERO(&fds);
  close(fd);
  close(serversock);

  return 0;
}

       以上代码使用网络编程(socket),实现了一个服务端(server)应用,完成向客户端发送消息和接收客户端的消息。

       将上述代码copy一下,在Linux系统中,直接使用GCC进行编译,然后运行可执行文件即可。可以使用telnet作为客户端玩一玩。

解释:

       对于熟悉网络编程的小伙伴来说,这些就比较easy了。如果已经成功跑起来了,就可以直接pass。

       对于没了解过或者刚接触网络编程的小伙伴,我先解释下一些基本概念,然后说一下让代码跑起来的具体操作。代码的话,大家可以自行去掌握和熟悉。

  1. 基本概念
           
    本来想说一些自己的“概念”,帮助各位小伙伴更好的理解上述代码和网络编程,但是我自己理解的概念可能与官方的有出入(可能解释的不到位),担心误导了刚入门的小伙伴,并且网络编程涉及一些网络原理的知识(其实也没有很难,说白了没学网络原理也能掌握上述代码,希望各位小伙伴不要望而止步),比较多,没办法全部解释说明白,所以基于这两点,就不和大家做过多的解释了。
           还是直接说下操作吧!
  2. 具体操作
           在Linux系统中,正常创建.c文件,将上述代码copy过去,然后使用 gcc filename.c -o filename 命令编译生成可执行的文件,直接运行即可。
           新建一个终端窗口,如果系统内没有telnet,可以直接yum install telnet -y,然后使用telnet localhost(IP) 7711(端口),进行连接,可以看到telnet终端界面显示了服务端发送的一条消息(Welcom to Chat!),接下来就可以正常发送消息给服务端了,服务端会将收到的消息打印出来。
  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值