用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);
}