亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 1557 | 回復(fù): 3
打印 上一主題 下一主題

[C] 請教一個網(wǎng)絡(luò)編程的問題 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2009-12-07 23:42 |只看該作者 |倒序瀏覽
目的:
建立一個tcp server,使用select多路復(fù)用處理用戶新建連接以及以及建立的連接的數(shù)據(jù)讀操作

思路:
1.建立server socket
2.把server socket加入select的讀數(shù)組
3.客戶端建立的連接加入select的讀數(shù)組
4.處理新的連接以及以及建立的連接的數(shù)據(jù)

代碼:
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#include <netinet/in.h> // struct sockaddr_in

#include <sys/select.h> // select()


#define SERVER_PORT 3361
#define BUFF_SIZE 512
#define MAX_TCP_CONNECTION 10

int main()
{
  int ServerFd, ClientFd[MAX_TCP_CONNECTION];
  int ClientAddrLen, Bytes, MaxClientIndex=0, i;
  struct sockaddr_in ServerAddr, ClientAddr;
  char Buf[BUFF_SIZE];
  fd_set readset;

  ServerFd = socket(AF_INET, SOCK_STREAM, 0);

  memset(&ServerAddr, 0, sizeof(struct sockaddr_in));
  ServerAddr.sin_family = AF_INET;
  ServerAddr.sin_port = htons(SERVER_PORT);
  ServerAddr.sin_addr.s_addr = htonl(INADDR_ANY);
  bind (ServerFd, (struct sockaddr*)&ServerAddr, sizeof(struct sockaddr));

  listen(ServerFd, 5);

  while(1)
  {
    FD_ZERO(&readset);
    FD_SET(ServerFd, &readset);
    for(i=0;i<MaxClientIndex;i++)
      FD_SET(ClientFd[i], &readset);
    if (MaxClientIndex)
      select(ClientFd[MaxClientIndex]+1, &readset, NULL, NULL, NULL);
    else
      select(ServerFd+1, &readset, NULL, NULL, NULL);
    if (FD_ISSET(ServerFd, &readset))
    {
      ClientFd[MaxClientIndex] = accept(ServerFd, (struct sockaddr*)&ClientAddr, &ClientAddrLen);
      printf("Ah, new connection < %d 0x%.8x:%d > established!\n", ClientFd[MaxClientIndex], ClientAddr.sin_addr.s_addr, ClientAddr.sin_port);
      MaxClientIndex++;
      printf("MAX Connection: %d\n", MaxClientIndex);
    }
    else
    {
      for(i=0;i<MaxClientIndex;i++)
      {
        if (!FD_ISSET(ClientFd[i], &readset))
          continue;
        Bytes = read(ClientFd[i], Buf, BUFF_SIZE-1);
        if (Bytes<=0)
          continue;
        Buf[Bytes] = '\0';
        printf("CONNECTION(%d) %s", ClientFd[i], Buf);
      }
    }

  }

  close(ServerFd);

  return 0;
}


現(xiàn)象:
客戶端可以建立到服務(wù)器的連接,但是以及建立連接的客戶端發(fā)送的數(shù)據(jù)服務(wù)器端收不到,使用gdb調(diào)試發(fā)現(xiàn)阻塞在select調(diào)用沒有返回。

問題:
如何處理accept還要處理read操作,謝謝。

論壇徽章:
0
2 [報告]
發(fā)表于 2009-12-08 00:22 |只看該作者
accept(ServerFd, (struct sockaddr*)&ClientAddr, &ClientAddrLen);

這里沒猜錯的話,返回的應(yīng)該是 -1 。原因是參數(shù)錯誤。
另外 沒有檢查 select 的返回值, 由于中斷原因會返回-1的。
maxfd +1 明顯不是簡單 ClientFd[MaxClientIndex]+1,  除非你打算永遠不關(guān)閉套接字。

論壇徽章:
0
3 [報告]
發(fā)表于 2009-12-08 23:21 |只看該作者
accept之后MaxClientIndex=1,而這時ClientFd[MaxClientIndex]+1是多少呢?
是ClientFd[1]+1
ClientFd[1]是多少呢,雖然你沒有初始化,但是0的概率還是蠻大的
select(0+1, &readset, NULL, NULL, NULL);結(jié)果是相當于檢測標準輸入了
雖然你的程序還有其他問題,但就你疑惑的問題來說,使用ClientFd[MaxClientIndex-1]而不是ClientFd[MaxClientIndex]應(yīng)該是正解

[ 本帖最后由 ssh210 于 2009-12-8 23:24 編輯 ]

論壇徽章:
0
4 [報告]
發(fā)表于 2009-12-09 10:32 |只看該作者
我覺得這程序的邏輯咋這亂。。。

[ 本帖最后由 wuexp 于 2009-12-9 10:44 編輯 ]
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP