用C进行多线程客户端服务器套接字编程

| 我正在同一台具有相同IP地址但具有不同客户端和服务器端口的计算机上用C实现多线程客户端-服务器套接字编程。我已经在C环境中使用pthread概念实现了它。但是我只能看到我的客户线程正在运行,而我的服务器线程一旦到达\'accept()\'例程就已停止。 我想知道可能是什么问题。如果有人可以找出我在哪里犯错,那将真的很有帮助 我的客户端代码如下所示:
void *client_connect(void *arg)
{

   int client_socket;
   struct sockaddr_in Serv_Addr;
   struct sockaddr_in Client_Addr;
   int addrlen=sizeof(Client_Addr);

   char send_buffer_client[] = {\"server message\"};
   char recv_buffer_client[1024];
   int nbytes;

   client_socket = lwip_socket(AF_INET, SOCK_STREAM, 0);
   if (client_socket < 0) ;

   memset((char *)&Serv_Addr, 0, sizeof(Serv_Addr));
   Serv_Addr.sin_family = AF_INET;
   Serv_Addr.sin_len = sizeof(Serv_Addr);
   Serv_Addr.sin_addr.s_addr = inet_addr(\"1.2.3.4\");
   Serv_Addr.sin_port = 9999;
   memset((char *)&Client_Addr, 0, sizeof(Client_Addr));
   Client_Addr.sin_family = AF_INET;
   Client_Addr.sin_len = sizeof(Client_Addr);
   Client_Addr.sin_addr.s_addr = inet_addr(\"1.2.3.4\");
   Client_Addr.sin_port = 5555;

   lwip_connect(client_socket, (struct sockaddr *)&Serv_Addr, sizeof(Serv_Addr));

   while (1) {

               do{
                   nbytes = lwip_recv(client_socket, recv_buffer_client, sizeof(recv_buffer_client),0);
                   if (nbytes>0) lwip_send(client_socket, send_buffer_client, sizeof(send_buffer_client), 0);

                   printf(\"server message = %s\\n\", recv_buffer_client);
               }  while (nbytes>0);

               sleep(10);

       }
       lwip_close(client_socket);
}
我的服务器代码:
void *server_connect(void *arg)
{

   int server_socket;
   struct sockaddr_in Serv_Addr;
   struct sockaddr_in Client_Addr;
   int addrlen=sizeof(Client_Addr);
   int clientfd;
   char send_buffer[] = {\"Server message\"};
   char recv_buffer[1024];
   int nbytes_server, client_length;

   server_socket = lwip_socket(AF_INET, SOCK_STREAM, 0);
   if (server_socket < 0)
   printf(\"could not create server socket\");
   else
   printf(\"created SERVER socket\");

   memset((char *)&Serv_Addr, 0, sizeof(Serv_Addr));
   Serv_Addr.sin_family = AF_INET;
   Serv_Addr.sin_len = sizeof(Serv_Addr);
   Serv_Addr.sin_addr.s_addr = inet_addr(\"1.2.3.4\");
   Serv_Addr.sin_port = 9999;


   client_length = sizeof(Client_Addr);
   if (lwip_bind(server_socket, (struct sockaddr *)&Serv_Addr, sizeof(Serv_Addr)) < 0) {           
           printf(\"could not BIND\");
   }

   if ( lwip_listen(server_socket, 20) != 0 ){
            printf(\"could not BIND\");
   }
   while (1) {
                lwip_accept(server_socket, (struct sockaddr*)&Client_Addr, &client_length);                

               do{
                nbytes_server = lwip_recv(server_socket, recv_buffer, sizeof(recv_buffer),0);
                if (nbytes_server>0){lwip_send(server_socket, send_buffer, sizeof(send_buffer), 0);}

                printf(\"client message = %s\\n\", recv_buffer);
                }while(nbytes_server>0); 
                sleepms(10);
       }
       lwip_close(server_socket);
}

void main(void)
{
    pthread_t  client_thread;
    pthread_t  server_thread;

    pthread_create(&server_thread, NULL, server_connect, NULL);
    pthread_create(&client_thread, NULL, client_connect, NULL);

    while(1){
        sleepms(1);
        }
}
如果我做错了方法,请告诉我 问候 德比     
已邀请:
这是至少3个错误: lwip_accept()返回一个新的套接字描述符,您应该使用该描述符从客户端读取,而不是从原始服务器套接字读取(还要注意,lwip_accept将阻塞,直到有人真正连接到服务器为止)。 如果您使用的是小端字节序计算机,则端口号可能也已关闭,它们通常以网络字节顺序排列,您应该这样做
Serv_Addr.sin_port = htons(9999);
和客户端端口相同-htons将短字节从主机字节序转换为网络字节序 您没有发送任何数据!您的客户端等待服务器向它发送东西。但是您的服务器不发送任何东西,它等待客户端发送东西。什么都不会发生。 检查lwip_connect是否也失败,并检查errno(如果您的环境提供了它),因为它可能会提供问题的线索     
如果您在同一台计算机上,则您使用的IP地址1.2.3.4不是本地主机的典型地址,该地址应为127.0.0.1。除非您实际使用路由器或其他某种方式设置了计算机的IP地址,否则该地址将无法解析,即使您试图在同一客户端和服务器上运行该IP地址也是如此。机器之间,他们找不到彼此,因为无法将1.2.3.4解析为网络上的给定机器。 同样,您也不需要将服务器锁定到特定的IP地址,只需使用
netinet/in.h
中的常量
INADDR_ANY
,它将常量绑定到系统上的任何接口。在客户端,尽管您仍然需要正确的IP地址,但是同样,如果它是本地主机,则可以只使用127.0.0.1。     
(1)看起来客户端和服务器都在等待接收某些东西,然后回显它。有人必须先讲话。 (2)我看不到您的lwip_accept返回一个用于与客户端通信的新套接字。您最终在侦听套接字上执行了recv / send。 (3)在这里还要考虑您的代码:
while (1)
{
    lwip_accept(server_socket, (struct sockaddr*)&Client_Addr, &client_length);

    do
    {
        nbytes_server = lwip_recv(server_socket, recv_buffer, sizeof(recv_buffer), 0);

        if (nbytes_server > 0)
        {
            lwip_send(server_socket, send_buffer, sizeof(send_buffer), 0);
        }

        printf(\"client message = %s\\n\", recv_buffer);
    }
    while (nbytes_server > 0);

    sleepms(10);
}
您阅读并回显了一条消息,但是从不关闭套接字(可能是明智的做法,因为它是监听套接字!),然后立即循环回以再次阻止接受。如果客户端不再连接,您将永远无法接受。 (4)您不需要那些sleepms()调用。在main中使用pthread_join()并除去其余部分。看来您所有的电话都阻塞了。     

要回复问题请先登录注册