寫出一個TCP服務器,實現可以讓兩個TCP客戶端通信(C/C++)簡易版

今天又是無聊的一天。
想了想,可以寫一個遊戲。並且能實現兩個人聯網互動。
因爲希望可以兩個人通過雲服務器來實現通信。
所以我選擇在雲服務器上,寫一個TCP服務器,再將兩個人的TCP信息互相轉發。
那麼說幹就幹。
首先,雲服務器是Linux系統,所以庫函數是在Linux下的。並且使用C/C++進行開發。
先來一個最簡單的版本。就是隻能兩個人通信。
先放出代碼。

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<netinet/in.h>
#include<string.h>
#include<signal.h>
#include<pthread.h>
int fd[2];


void *pthread_fun(void *arg)
{ 
    while(1)
    {
        char buf[128] = "";
        int ret =  recv(fd[0],buf,sizeof(buf), 0 );
        if(ret == 0)
        {
            char *a = "close";
            send(fd[1],a,strlen(a),0);
            exit(1);
        }
        send(fd[1],buf,strlen(buf),0);
    }
}

int main(int argc,char const *argv[])
{
if(argc < 2)
{
    fprintf(stderr,"usage: %s <server_port> \n",argv[0]);
    exit(1);
}
int sockfd,acceptfd;
struct sockaddr_in serveraddr,clientaddr;
socklen_t addrlen = sizeof(serveraddr);
if((sockfd = socket(AF_INET,SOCK_STREAM,0)) < 0 )
{
    perror("fail to socket");
}
int on = 1;
if(setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on)) < 0 )
{
    perror("fail to set sockopt ");
}
serveraddr.sin_family = AF_INET;
serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);
serveraddr.sin_port = htons(atoi(argv[1]));
if(bind(sockfd,(struct sockaddr *)&serveraddr,addrlen) < 0)
{
    perror("fail to bind");
}
if(listen(sockfd,20) < 0)
{
    perror("fail to listen");
}
    if((acceptfd = accept(sockfd,(struct sockaddr *)&clientaddr,&addrlen)) < 0)
    {
        perror("fail to accept");
    }
    fd[0] =   acceptfd;
    if((acceptfd = accept(sockfd,(struct sockaddr *)&clientaddr,&addrlen)) < 0)
    {
        perror("fail to accept");
    }
    fd[1] = acceptfd;
    pthread_t thread ;
    if(pthread_create(&thread,NULL,pthread_fun,NULL) != 0)
    {
        perror("fail to pthread_create");
    }
    pthread_detach(thread);
while (1)
{
        char buf[128] = "";
        int ret =  recv(fd[1],buf,sizeof(buf), 0 );
        if(ret == 0)
        {
            char *a = "close";
            send(fd[0],a,strlen(a),0);
            exit(1);
        }
        send(fd[0],buf,strlen(buf),0);
    }
return 0 ;
}

再講解思路。
由於,希望寫出最簡單的雙人TCP客戶端通信。所以採用文件描述符數組的方式,來讓雙方獲取到對方的文件描述符,以便發送。
在其餘部分,獲取前兩次TCP連接,將一個TCP客戶端通過線程分離單獨處理。
由於數組是全局變量,在一個進程中所有線程函數共享全局變量,所以在獲得到兩個TCP客戶端後,就可以通過對方的文件描述符進行發送,只需要接收自己文件描述符發來的數據進行轉發數據。就可以實現這個功能了。然後也要對任意一方退出時進行處理。
如果用Python寫的話,會更加簡便。
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章