使用 c connect() 连接被拒绝?

标签 c linux sockets tcp connect

我在使用 c connect() 打开与本地服务器的 TCP 连接时遇到了一些问题(我在 VirtualBox 制作的虚拟机上使用 Ubuntu 16.04)。当我启动服务器时一切正常,它开始监听 S_PORT。当客户端尝试使用 connect() 打开与它的 TCP 连接时,程序停止,并且 errno 设置为 111(连接被拒绝)。有关更多信息,我发布了以下代码:

客户代码:

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

   int sock_cli;
   int err;
   unsigned short port = 0;

   struct in_addr addr;
   struct sockaddr_in addr_serv;
   struct hostent* ptr = NULL;
   messaggio* m = (messaggio*)malloc(sizeof(messaggio));

   /* Opening socket */
   sock_cli = socket(PF_INET,SOCK_STREAM,0);

   if(sock_cli == -1){ 
        printf(" (client) problem with socket() function \n");
        return -1;
   }
   else printf(" (client) socket open successfully, fd: %d \n",sock_cli);   

   #ifdef _ARG
   printf(" (client) argc : %d \n",argc);
   for(int i=0;i<argc;i++) printf( " (client) argv[%d] =  %s \n",i,argv[i]);
   #endif

   /* Set address/port */
   if(argc == 3){ 
        if(!strcmp(argv[1],"localhost")){
             ptr = gethostbyname("localhost");
        }  
        else inet_aton(argv[1],&addr);
        port = atoi(argv[2]);

        #ifdef _DEBUG
        printf(" (client) port %d \n",port);
        #endif
   }
   else{ 
        printf(" (client) few arguments, args = [host] [port] \n");
        return -1;  
   }

   /* Set addr_serv */
   addr_serv.sin_family = AF_INET;
   addr_serv.sin_port = htons(port);
   memcpy(&addr_serv.sin_addr.s_addr,ptr->h_addr,ptr->h_length);
   memset(addr_serv.sin_zero,'\0',sizeof(addr_serv.sin_zero));  

   err = connect(sock_cli,(struct sockaddr*)&addr_serv,sizeof(addr_serv));

   if(err == -1){ 
        printf(" (client) connect() failed %d \n",errno);
        return -1;
   }
   else printf(" (client) connect() open successfully \n");

   m->type = 1;
   m->a = rand() % 10 + 1;
   m->b = rand() % 10 + 1;

   if(send(sock_cli,(void*)m,sizeof(messaggio)-sizeof(long),0) > 0){
        printf(" (client) couple send (%d,%d) \n",m->a,m->b);
   }

   recv(sock_cli,(void*)m,sizeof(messaggio)-sizeof(long),0); 

   #ifdef _DEBUG
   printf(" (client) msg received, product: %d \n",m->prod);
   #endif

   close(sock_cli);
   free(m);
   return 0;
}

这是服务器的代码:

#define S_PORT 3550
#define N_CLI 5

int main(){

     int sock_serv; // server socket
     int sock_cli; // client socket
     unsigned int sin_size; 
     int err;

     struct sockaddr_in addr_serv;
     struct sockaddr_in addr_cli;
     messaggio* m = (messaggio*)malloc(sizeof(messaggio));

     /* Opening socket */
     sock_serv = socket(PF_INET,SOCK_STREAM,0);

     if(sock_serv == -1) {
          printf(" (server) problem with socket() function \n");
          return -1;
     }
     else printf(" (server) socket open successfully, fd: %d \n",sock_serv);

     /* Set addr_serv */
     addr_serv.sin_family = AF_INET;
     addr_serv.sin_port = htons(S_PORT);
     addr_serv.sin_addr.s_addr = htonl(INADDR_ANY);
     memset(addr_serv.sin_zero,'\0',sizeof(addr_serv.sin_zero));

     /* Bind */
     err = bind(sock_serv,(struct sockaddr*)&addr_serv,sizeof(addr_serv));

     if(err == -1){ 
          printf(" (server) bind() failed \n");
          return -1;
     }
     else printf(" (server) bind() ok, address 'localhost', port %d \n",addr_serv.sin_port);    

     /* Listen */
     err = listen(sock_serv,N_CLI);

     if(err == -1) {
          printf(" (server) listen() failed \n");
          return -1;
     }
     else printf(" (server) listening \n"); 

     /* Accept */
     sin_size = sizeof(addr_cli);
     sock_cli = accept(sock_serv,(struct sockaddr*)&addr_cli,&sin_size);

     if(sock_cli == -1){ 
          printf(" (server) no connection open \n");
          return -1;
     }  
     else printf(" (server) connection open with client, sock_cli: %d \n",sock_cli);    

     recv(sock_cli,(void*)m,sizeof(messaggio)-sizeof(long),0); // bloccante

     m->prod = (m->a)*(m->b);

     send(sock_cli,(void*)m,sizeof(messaggio)-sizeof(long),0);

     close(sock_cli);

     printf(" (server) connection close \n");

     close(sock_serv);
     free(m);
     return 0;
}

这是 Output 的屏幕

最佳答案

端口错误。您绑定(bind)到端口 3550 (0xdde),但随后您打印 非字节交换版本 56845 (0xde0d)。然后您尝试连接到客户端中的那个。

当您在服务器中打印时,您需要换回 native 字节顺序 (ntohs(addr_serv.sin_port)) 或仅将“3550”传递给客户端,因为这是您要绑定(bind)的内容在服务器中。

关于使用 c connect() 连接被拒绝?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40749933/

相关文章:

c - 我第一次使用 poll(),是否需要无限循环?

c - 具有 FIFO 的 Posix 信号量无法正常工作

c - 在 Ada-C 绑定(bind)应用程序中映射结构成员的最佳实践

java - 使用ThreadPool的多线程UDP服务器

java - 文件传输后无输入传输 - Socket

c - fscanf 具有 double 和字符的文件

Linux - 使用 mutt 在电子邮件中格式化主题和单词

c - 简单设备驱动程序不工作

java - 如何在同一容器中运行 COPY 和 RUN 命令?

sockets - 如何绑定(bind)到正确的地址和端口以进行 UDP 通信?