诚心求教为什么socket远程连接不通,只能本地连接?解决办法

诚心求教为什么socket远程连接不通,只能本地连接?
求高手帮帮忙啊,我的客户端和服务器只能在同一台机器上使用,客户端在别人的机子就连不到我的服务器了。不是只要在客户端设置好their_addr.sin_addr.s_addr= inet_addr("服务器ip");就可以了吗?
还有一个问题就是,我的客户端只能联通服务器一次,连通完之后就,第二次循环就不能再次连上了。
本人是个新手,自己弄了好几天都弄不出来,真心求解,求哪位大神帮下忙,真的感激不尽。


//服务器
#include<winsock2.h>
#include<stdio.h>
#include<string.h>
#include<unistd.h>

#define MYPORT 4000 
#define BACKLOG 5 
#define MAXDATASIZE 100 
  
int main()
{
WSADATA wsaData;
    //初始化Socket库
    WSAStartup(MAKEWORD(2,0),&wsaData);
int sockfd,newfd;
int sin_size, numbytes;

SOCKADDR_IN my_addr;
SOCKADDR_IN their_addr; 
my_addr.sin_family=AF_INET;
my_addr.sin_port=htons(MYPORT);
my_addr.sin_addr.s_addr = INADDR_ANY;
ZeroMemory(&(my_addr.sin_zero), 8);
if((sockfd=socket(AF_INET,SOCK_STREAM,0))==SOCKET_ERROR)
{
perror("socket");  
        exit(1);  
}
if(bind(sockfd,(struct sockaddr*)&my_addr,sizeof(struct sockaddr))==SOCKET_ERROR)
{
perror("bind");  
        exit(1); 
}
if(listen(sockfd,BACKLOG)==SOCKET_ERROR)
{
perror("listen");  
        exit(1);  
}
char recvbuf[MAXDATASIZE];
char sendbuf[MAXDATASIZE];

while(1)
{
printf("\n~~~~~~~等待连接~~~~~~~\n\n");
sin_size=sizeof(struct sockaddr_in);
if((newfd=accept(sockfd,(struct sockaddr *)&their_addr,&sin_size))==SOCKET_ERROR) 
{
perror("accept");  
            continue;  
}

printf("服务器已连接\n");
printf("请输入:");



ZeroMemory(sendbuf,MAXDATASIZE);
gets(sendbuf);

if(send(newfd,sendbuf,sizeof(sendbuf),0)==SOCKET_ERROR){  
                perror("send");  
                exit(0);  
            }   
            
       numbytes = recv(newfd, recvbuf, MAXDATASIZE, 0);

       recvbuf[numbytes] = '\0';

       printf("对方回应: %s",recvbuf); 
       closesocket(newfd);
       
       

return 0;





//客户端
#include<winsock2.h>
#include<stdio.h>
#include<string.h>

#define PORT 4000  
#define MAXDATASIZE 100 

int main()
{

    WSADATA wsaData;
    //初始化Socket库
    WSAStartup(MAKEWORD(2,0),&wsaData);
int sockfd,numbytes;
struct hostent *he;
struct sockaddr_in their_addr;
char ServerName[128];
gethostname(ServerName, 128);  
    he = gethostbyname(ServerName);
    
    sockfd=socket(AF_INET,SOCK_STREAM,0);
    
    their_addr.sin_family=AF_INET;
    their_addr.sin_port=htons(PORT);
    their_addr.sin_addr= *((struct in_addr *)he->h_addr);
    their_addr.sin_addr.s_addr= inet_addr("123.67.189.18");
    ZeroMemory(&(their_addr.sin_zero), 8);
    
    char recvbuf[MAXDATASIZE];
    char sendbuf[MAXDATASIZE];
    
    
    while(1)
{
    if(connect(sockfd,(struct sockaddr *)&their_addr,sizeof(struct sockaddr))==SOCKET_ERROR)
    {
     perror("connect");
      continue;
    }
      
    numbytes=recv(sockfd,recvbuf,MAXDATASIZE,0);
    if(numbytes==SOCKET_ERROR)
    {
     perror("recv");
     break;
    }
    recvbuf[numbytes]='\0';
    printf("Received: %s\n",recvbuf);
    printf("please write:");
    ZeroMemory(sendbuf,sizeof(sendbuf));
    gets(sendbuf);
    printf("\n");
    
    if(send(sockfd,sendbuf,MAXDATASIZE,0)==SOCKET_ERROR)
    {
     perror("send");
     break;
    }
    
    }