写出一个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写的话,会更加简便。
在这里插入图片描述

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