- 论坛徽章:
- 0
|
本帖最后由 liuchang8877 于 2012-08-16 12:31 编辑
1,客户端发送,服务端接收
发送时 收到Connection reset by peer
2,单是 服务端 隐去 接收完数据写入共享内存这块代码,客户端就不会报错
3,服务端的例子是WRichardStevens UNP 有关 select() 讲解时的例子,除了 共享内存写入这块自己 添加的
希望大牛给点指点- int i = 0,maxi = 0,maxfd = -1;
- int listenfd = -1,connfd = -1,sockfd = -1;
- int nready,client[FD_SETSIZE];
- ssize_t n = 0;
- fd_set rset,allset;
- char buf[CARD_DATA_SIZE];
- socklen_t clilen;
- struct sockaddr_in cliaddr,servaddr;
- int bind_re = -1, listen_re = -1;
- char cTemp[CARD_DATA_SIZE];
- char cMiddleBuff[CARD_DATA_SIZE*2];
- long lMiddLen = 0;
- int iWriteCacheSuccess = 0;
- int result;
- memset(cTemp,0,CARD_DATA_SIZE);
- memset(cMiddleBuff,0,CARD_DATA_SIZE*2);
- memset(buf,0,CARD_DATA_SIZE);
- listenfd = socket(AF_INET,SOCK_STREAM,0);
- memset(&servaddr,0,sizeof(servaddr));
- servaddr.sin_family = AF_INET;
- servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
- servaddr.sin_port = htons(21000);
- printf("listenfd:%d\n",listenfd);
- bind_re = bind(listenfd,(struct sockaddr*)&servaddr,sizeof(servaddr));
- if(bind_re < 0){
- printf("bind error:%s\n",strerror(errno));
- exit(1);
- }
- printf("bind_re :%d\n",bind_re);
- listen_re = listen(listenfd,LISTENQ);
- if(listen_re < 0){
- printf("listen error:%s\n",strerror(errno));
- exit(1);
- }printf("listen_re:%d\n",listen_re);
- maxfd = listenfd;
- maxi = -1;
- for(i = 0 ; i < FD_SETSIZE; i++){
- client[i] = -1;
- }
- FD_ZERO(&allset);
- FD_SET(listenfd,&allset);
- for(;;){
- /*change*/
- //bcopy(&rset,&allset,sizeof(allset));
- rset = allset;
- printf("select...\n");
- nready = select(maxfd+1,&rset,NULL,NULL,NULL);
- if(FD_ISSET(listenfd,&rset)){
- clilen = sizeof(cliaddr);
- connfd = accept(listenfd,(struct sockaddr*)&cliaddr,&clilen);
- printf("accept :connfd:%d\n",connfd);
- for(i = 0; i < FD_SETSIZE; i++){
- if(client[i] < 0){
- client[i] = connfd;
- break;
- }
- }
- if(i == FD_SETSIZE){
- printf("too many clients");
- exit(1);
- }
- FD_SET(connfd,&allset);
- if(connfd > maxfd){
- maxfd = connfd;
- }
- if(i > maxi)
- maxi = i;
- if(--nready <= 0) continue;
- }//FD_ISSET
- for(i = 0; i <= maxi; i++){
- if((sockfd = client[i]) < 0)
- continue;
- if(FD_ISSET(sockfd,&rset)){
- if((n = recv(sockfd,buf,CARD_DATA_SIZE,0)) == 0){
- close(sockfd);
- FD_CLR(sockfd,&allset);
- client[i] = -1;
- }else{
- printf("ok\n,result:%d\n",n);
- /*this this to write data to my Ringshm*/
- /*if i donot save it in the Ring Shm */
- /*the client will not get the error*/
- memcpy(cMiddleBuff+lMiddLen,buf,n);
- lMiddLen += n;
- if(lMiddLen > CARD_DATA_SIZE){
- do{
- iWriteCacheSuccess =
- writeRingShm(semId[pchannel->cardid],
- buffer[pchannel->cardid],
- (char *)cMiddleBuff,CARD_DATA_SIZE);
- }while(0 == iWriteCacheSuccess);
- memcpy(cTemp,cMiddleBuff+CARD_DATA_SIZE,
- lMiddLen - CARD_DATA_SIZE);
- memcpy(cMiddleBuff,cTemp,lMiddLen - CARD_DATA_SIZE);
- lMiddLen -= CARD_DATA_SIZE;
- }
- }
- if(--nready <= 0)
- break;
- }//FD_ISSET
- }//for
- }//for(;;)
复制代码 |
|