簡體   English   中英

服務器未從客戶端讀取消息

[英]Server doesn't read message from client

我正在嘗試實現一個簡單的多線程客戶端/服務器程序:客戶端向服務器發送一個數字,服務器創建一個線程,該線程發送回數字+1。

問題如下:客戶端沒有問題地連接到服務器; (據我所知)線程是沒有問題的; 但是在客戶端將數字寫入套接字后,服務器根本看不到它。 對read()的調用沒有任何錯誤,它只是坐在那里,一直等待。

我嘗試通過它發送多個整數。 沒有不同。 我懷疑是文件描述符服務器端被錯誤地傳遞給線程,但是我不知道怎么辦。 我的另一個懷疑是,我缺少了一個顯而易見的東西。

無論哪種方式,幫助都是值得的。 有任何想法嗎?

服務器端:創建線程的循環。

    while (1) {

    int client;

    printf("[server]Waiting at port %d...\n", PORT);
    fflush(stdout);

    int length = sizeof(from);
    if (client = accept(sd, (struct sockaddr*)&from, &length) < 0) {
        perror("[server]Error: accept().");
        continue;
    }

    pthread_t th_id;
    pthread_create(&th_id, NULL, &treat, &client);

    }

服務器端:線程的處理功能(問題在這里)。

void* treat(void* client)
{

printf("[thread]Waiting for message...\n");
fflush(stdout);
pthread_detach(pthread_self());

int client_sd = *((int*)client);

int nr;
if (read(client_sd, &nr, sizeof(int))) {
    perror("[thread]Error: read().");
    exit(-1);
}
// The program won't reach this point.
printf("[thread]Read: %d", nr);
fflush(stdout);

close(*((int*)client));
return (NULL);

}

客戶端:

      if (connect (sd, (struct sockaddr *) &server,sizeof (struct sockaddr)) == -1)
    {
      perror ("[client]Error: connect().\n");
      return errno;
    }

  printf ("[client]Write a number: ");
  fflush (stdout);

  scanf("%d",&nr);

  printf("[client] Read %d\n",nr);

  if (write (sd,&nr,sizeof(int)) <= 0)
    {
      perror ("[client]Error: write()\n");
      return errno;
    }

    //the program reaches here.
  printf("[client]The message was sent\n");

問題出在線上

if (client = accept(sd, (struct sockaddr*)&from, &length) < 0) {

它被解釋為

if (client = (accept(sd, (struct sockaddr*)&from, &length) < 0)) {

如果accept返回正數,則client設置為0 然后從stdin中讀取線程中的后續讀取。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM