C++ 簡易scoket Server

jopen 10年前發布 | 11K 次閱讀 scoket C/C++開發

//

include <stdio.h>

include <stdlib.h>

include <unistd.h>

include <string.h>

include <sys/types.h>

include <sys/socket.h>

include <netinet/in.h>

include <arpa/inet.h>

include <errno.h>

include <sys/select.h>

define MAXUSERS 5

define BUFFER_SIZE 64

define FD_LIMIT 65535

int USERS[MAXUSERS]; int user_count = 0;

void showclient() { int i; printf("user_count: %d\n", user_count); for (i = 0; i < MAXUSERS; i++) { printf("[%d]:%d ", i, USERS[i]); } printf("\n\n"); }

int main(int argc, const char * argv[]) {

struct sockaddr_in server_addr;
struct sockaddr_in client_addr;

socklen_t client_addrlength = sizeof(client_addr);


bzero(&server_addr, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(33333);
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);

//創建
int sock_fd = socket( PF_INET, SOCK_STREAM, 0 );
if (sock_fd<0) {
    printf("socket error:%d",errno);
    close(sock_fd);
    exit(1);
}


int yes = 1;
if (setsockopt(sock_fd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)) == -1) {
    perror("setsockopt");
    exit(1);
}


int sret;

//綁定
sret = bind( sock_fd, (struct sockaddr *)&server_addr, sizeof(server_addr) );
if (sret<0) {
    printf("bind error:%d",errno);
    close(sock_fd);
    exit(2);
}

//監聽
sret = listen(sock_fd, MAXUSERS);
if (sret<0) {
    printf("listen error:%d",errno);
    close(sock_fd);
    exit(3);
}
printf("start ok, listen port:%d\n", ntohs(server_addr.sin_port));

char buf[1024];
int maxsock = sock_fd;


fd_set read_fds;        //可讀
ssize_t ret;

while (1) {

    FD_ZERO(&read_fds);
    FD_SET(sock_fd, &read_fds);

    //需要監聽的集合
    for (int i =0; i<user_count; i++) {
        if (USERS[i] != 0) {
            FD_SET(USERS[i], &read_fds);
        }
    }

    //注冊監聽事件
    ret = select(maxsock+1, &read_fds, NULL, NULL, NULL);
    if (ret<0) {
        printf("select error\n");
        continue;
    }else if (ret==0){
        printf("select timeout\n");
        continue;
    }

    //讀取客戶端發來的數據
    for (int i =0; i<user_count; i++) {
        if (FD_ISSET(USERS[i], &read_fds)) {
            ret = recv(USERS[i], buf, sizeof(buf), 0);
            printf("client[%d] send:%s\n", i, buf);
        }
    }

    //處理新用戶鏈接
    if (FD_ISSET(sock_fd, &read_fds)) {
        printf("new client\n");
        int new_fd = accept(sock_fd, (struct sockaddr *)&client_addr, &client_addrlength);
        if (new_fd<0) {
            printf("accept error\n");
            close(new_fd);
            continue;
        }

        USERS[user_count] = new_fd;
        printf("new connection client[%d] %s:%d\n", user_count,
               inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));
        user_count++;
        if (new_fd > maxsock){
            maxsock = new_fd;
        }
    }

    showclient();
}




close(sock_fd);
return 0;

}</pre>

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!