作者 主題: socke和rs232互傳,在linux平台上,用C  (閱讀 4218 次)

0 會員 與 1 訪客 正在閱讀本文。

deh3215

  • 可愛的小學生
  • *
  • 文章數: 4
    • 檢視個人資料
socke和rs232互傳,在linux平台上,用C
« 於: 2013-06-25 00:10 »
要寫一隻server端程式,如果rs232有資料進來,則送往clinet,如果ethernet有資料進來,則

送往rs232.

目前遇到一個問題,server端程式起來listen(rs232,ether),rs232送資料到server,client連線上,收

到server送來的資料,目前client連上,server有收到就送給client,但就只送一次,如果沒收到,就沒送給client

server端,省略前面open rs232, open socket, bind listen的code...

while(1)
{   
   len = sizeof(clientAddr);
   clientfd = accept(sock_fd,(struct sockaddr*)&clientAddr,&len);
   if(clientfd == -1)   
      continue;
      
   memset(buf, 0, BUFFER_SIZE);
      
   if(clientfd != -1)
   {
      n = RS232_PollComport(comportNo, buf, BUFFER_SIZE);
      printf("%s",buf);      
      n = send(clientfd,buf,n,0);
      //write(clientfd,buf,BUFFER_SIZE);//stdout
   }
}
   
close(sock_fd);
close(clientfd);   
RS232_CloseComport(comportNo);   

================================
client 端, open socket, connect省略
while(1)   
{   
   n = recv(sock_fd,tmp_buf,BUFFER_SIZE,0);
   //printf("n = %d\n", n);      
   printf("%s", tmp_buf);      
}
   close(sock_fd);

client連線後就只能收到一次,server就只送一次,client也收到一次~~無法server一直收rs232,透過ethernet不斷丟給client~~~

這樣寫有什麼邏輯錯誤的問題?該如何修正?

twu2

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 5409
  • 性別: 男
    • 檢視個人資料
    • http://blog.teatime.com.tw/1
Re: socke和rs232互傳,在linux平台上,用C
« 回覆 #1 於: 2013-06-25 08:50 »
沒斷線的情形嗎?
你的 server 那個 loop 就只收送一次, 當然就只做一次. (會回到 accept, 那是要等下一個連線, 不是同一個連線)

一般會用 fork 來處理 tcp client 連上的動作, 然後 server 等下一個連線.
不過你連上後是要用 rs232 (不能同時使用), 所以用 fork 會很奇怪.... 也許可以一樣 fork 來處理, 只是打不開 rs232 (有人用時), 就傳回錯誤.

deh3215

  • 可愛的小學生
  • *
  • 文章數: 4
    • 檢視個人資料
Re: socke和rs232互傳,在linux平台上,用C
« 回覆 #2 於: 2013-06-25 20:41 »
我也發現我誤解accept的意思~~怪不得client連一次就只能接收一次~~ :'(

deh3215

  • 可愛的小學生
  • *
  • 文章數: 4
    • 檢視個人資料
Re: socke和rs232互傳,在linux平台上,用C
« 回覆 #3 於: 2013-06-25 21:16 »
沒斷線的情形嗎?
你的 server 那個 loop 就只收送一次, 當然就只做一次. (會回到 accept, 那是要等下一個連線, 不是同一個連線)

一般會用 fork 來處理 tcp client 連上的動作, 然後 server 等下一個連線.
不過你連上後是要用 rs232 (不能同時使用), 所以用 fork 會很奇怪.... 也許可以一樣 fork 來處理, 只是打不開 rs232 (有人用時), 就傳回錯誤.
twu2,您好,那改成這樣,為何client斷線(ctrl+c),server也會斷線呢?

int clientfd = -1;
while(1)
{   
   if(clientfd == -1)
   {
                        len = sizeof(clientAddr);
      clientfd = accept(sock_fd,(struct sockaddr*)&clientAddr,&len);
   }      
      
   while(1)
   {   
      memset(buf, 0, BUFFER_SIZE);
      n = RS232_PollComport(comportNo, buf, BUFFER_SIZE);
      printf("%s",buf);      
      //n = send(clientfd,buf,n,0);
      write(clientfd,buf,BUFFER_SIZE);//stdout
   }
}
從程式來看,應該不會client斷線,server也中斷才對~~~
« 上次編輯: 2013-06-25 21:19 由 deh3215 »

deh3215

  • 可愛的小學生
  • *
  • 文章數: 4
    • 檢視個人資料
Re: socke和rs232互傳,在linux平台上,用C
« 回覆 #4 於: 2013-06-29 17:14 »
已得到解答~~~
n = send(clientfd,buf,BUFFER_SIZE,0);  這行將0改為MSG_NOSIGNAL
加上這行判斷,終於達到我要的做法~~~~~~
if(n == -1)     {
   close(clientfd);
   break;
}