Linux Socket 编程 -- 最简单server 端和 Client 端

Linux Socket 编程Server 端代码:

#include <stdio.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <fcntl.h>
#include <pthread.h>
#include <time.h>

#define BUFFER_LENGTH   128
#define  BACKLOG  10

int main()
{
    int listenfd;//server 端 需要监听的 fd
    int clientfd; // accept 获得的 客户端 fd
    struct sockaddr_in servaddr;//IPV4的 socket 地址结构
    struct sockaddr_in client;//IPV4的 socket 地址结构
    socklen_t len;//地址结构的长度
    int ret;//返回值
    unsigned char buffer[BUFFER_LENGTH] = {0}; // 与缓冲区交互的用户空间的内存地址
    listenfd = socket(AF_INET,SOCK_STREAM,0);// 创建server 端的socket
    if(listenfd == -1) 
    {
        printf("create socket error\n"); // 使用 perror最好
        return -1;
    }
    //组装socket 地址结构
    servaddr.sin_family = AF_INET;
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    servaddr.sin_port = htons(9999);
    // 绑定 IP 端口 这样 client 端就 知道 IP 端口信息就可以连接了
    if(bind(listenfd,(struct sockaddr*)&servaddr,sizeof(servaddr))==-1) 
    {
        return -2;
    }
    listen(listenfd,BACKLOG);//监听 等待 client连接
     len = sizeof(client);
    clientfd = accept(listenfd,(struct sockaddr* )&client,&len);
    ret = recv(clientfd,buffer,BUFFER_LENGTH,0);
    if(ret == 0 ) 
    {
            close(clientfd);
    }
    printf("buffer: %s,ret:%d\n",buffer,ret);
    ret = send(clientfd,buffer,ret,0);
#Client 端代码(Client.c):
#include <stdio.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <fcntl.h>
#include <pthread.h>
#include <time.h>

#define BUFFER_LENGTH   128

#define msg  "Hello from client"

int main()
{
  int sockfd;//需要连接的sockfd
  //int clientfd; // accept 获得的 客户端 fd
  struct sockaddr_in servaddr;//IPV4的 socket 地址结构
  socklen_t len;//地址结构的长度
  int ret;//返回值
  int recvbytes;//收到的字节数
  unsigned char buffer[BUFFER_LENGTH] = {0}; // 与缓冲区交互的用户空间的内存地址
  
  sockfd = socket(AF_INET,SOCK_STREAM,0);
  if(sockfd == -1)
  {
      printf("create socket error!\n");
      return -1;
  }
  //组装 server 端 地址信息
  servaddr.sin_family = AF_INET;
  servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
  servaddr.sin_port = htons(9999);
  
  int success = connect(sockfd,(struct sockaddr*)&servaddr,sizeof(struct sockaddr));
  if(success == -1)
  {
      printf("connect error\n");
  }
  ret = send(sockfd,msg,sizeof(msg),0);
  recvbytes= recv(sockfd,buffer,BUFFER_LENGTH,0);
  buffer[recvbytes]='\0';
  printf("received: %s\n",buffer);
  close(sockfd);

}

实验结果

启动 server

./server

查看端口占用 9999 处于listen 状态等待客户端连接

netstat -anop | grep 9999
tcp        0      0 0.0.0.0:9999            0.0.0.0:*               LISTEN      11905/./server_1     off (0.00/0/0)

启动客户端

./client
received: Hello from client

server 端反应

buffer: Hello from client,ret:18

总结:如图
在这里插入图片描述

存在问题

  1. 客户端连接并且能够发送,另一个客户端能够建立链接但是不能发送。
  2. 当断开连接的时候,server 进程会循环 recv,并且返回值为0.
  3. 只能连接一次,不能再次连接。

请看下期

相关接口函数

socket

在这里插入图片描述

bind

在这里插入图片描述

listen

在这里插入图片描述

accept

在这里插入图片描述

文章参考与<零声教育>的C/C++linux服务期高级架构系统教程学习:
服务器高级架构体系:https://ke.qq.com/course/417774?flowToken=1010783

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值