Linux下 C语言编写 TCP Server

用c写的,做了函数的封装,记录在此,方便查找

server.h

#ifndef __SERVER_H
#define __SERVER_H

#define FALSE -1
#define TRUE 0

int Server_Init(char *server_port); //服务器初始化
int Wait_Accept(int server_fd);     //等待客户机连接
void Server_Destory(int server_fd); //销毁服务器
#endif

server.c

#include "server.h"
#include <arpa/inet.h>
#include <errno.h>
#include <net/if.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <unistd.h>
#define SIZE 128
#define BUFSIZE 1024

int Server_Init(char *server_port) {
  printf("Server_Init\n");
  int server_fd;
  struct sockaddr_in server_raddr;

  server_fd =
      socket(AF_INET, SOCK_STREAM, 0 /*IPPROTO_TCP,IPPROTO_SCTP*/); //创建套接字
  if (server_fd < 0) {
    fprintf(stderr, "%s\n", strerror(errno));
    return -1;
  }

  int val = 1;
  if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &val,
                 sizeof(val)) < 0) //设置套接字
  {
    fprintf(stderr, "%s\n", strerror(errno));
    close(server_fd);
    return -2;
  }
  server_raddr.sin_family = AF_INET;
  server_raddr.sin_port = htons(atoi(server_port));
  inet_pton(AF_INET, "0.0.0.0", &server_raddr.sin_addr);
  if (bind(server_fd, (void *)&server_raddr, sizeof(server_raddr)) <
      0) { //将套接字和地址绑定
    fprintf(stderr, "%s\n", strerror(errno));
    close(server_fd);
    return -3;
  }
  // listen第二参数为等待连接队列的最大长度  不管设置的多少,都会被舍入系统里面最接近的有效值
  //目前测试,设置为1  能同时连上3个
  if (listen(server_fd, 5) <
      0) { // listen在套接字函数中表示让一个套接字处于监听到来的连接请求的状态
    fprintf(stderr, "%s\n", strerror(errno));
    close(server_fd);
    return -4;
  }
  char ipstr[128];
  if (inet_ntop(AF_INET, &server_raddr.sin_addr, ipstr, sizeof(ipstr)) ==
      NULL) {
    fprintf(stderr, "%s\n", strerror(errno));
  }
  printf("[%d] server :%s  %d\n", server_fd, ipstr,
         ntohs(server_raddr.sin_port));
  return server_fd;
}

int Wait_Accept(int server_fd) {
  printf("Wait_Accept\n");
  if (server_fd < 0) {
    fprintf(stderr, "server_fd is err\n");
    return FALSE;
  }
  int new_client_fd = -1;
  struct sockaddr_in new_client_raddr;
  socklen_t new_client_raddr_len = sizeof(new_client_raddr);
  new_client_fd =
      accept(server_fd, (void *)&new_client_raddr, &new_client_raddr_len);
  if (new_client_fd < 0) {
    fprintf(stderr, "%s\n", strerror(errno));
    return FALSE;
  }
  char ipstr[128];
  if (inet_ntop(AF_INET, &new_client_raddr.sin_addr, ipstr, sizeof(ipstr)) ==
      NULL) {
    fprintf(stderr, "%s\n", strerror(errno));
  }
  printf("[%d] CLIENT:%s  %d\n", new_client_fd, ipstr,
         ntohs(new_client_raddr.sin_port));
  return new_client_fd;
}
void Server_Destory(int server_fd) { //销毁服务器
  close(server_fd);
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值