关于网络编程的,想高手来指点一下

gracian 2003-10-20 03:27:35
不知道不用多线程能不能做一个象聊天室那样的程序来?不用界面,就用c来写的,调用 win api函数,我用select,好象不怎么行,也设置了非阻塞模式。谁能告诉我个思路,我感觉比较乱:(。
...全文
81 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
panzhaoping 2003-10-21
  • 打赏
  • 举报
回复
请不要把代码弄上去
可以简明说说的
gracian 2003-10-21
  • 打赏
  • 举报
回复
up:(
gracian 2003-10-21
  • 打赏
  • 举报
回复
服务器要多cpu?不会吧,一个cpu只能满足一个申请?别人的聊天室程序是怎么做的呢,装一下不是就能大家聊的吗?
gracian 2003-10-21
  • 打赏
  • 举报
回复


这个是我从unix书上改下来的,请大家看看,也感觉这思路不怎么对,我估计是不是处理客户端消息上有问题。
几个同时能连接上,就是不能同时的发消息。
//server

#include <stdio.h>
#include <stdlib.h>
#include <Winsock2.h>
#include <string.h>
#include <io.h>

#define MAXLINE 100
#define SERV_PORT 7001
#define LISTENQ 10
#define FD_SETSIZE 20
//int writen(int fd,const void *vptr,size_t n);
//int readline(int fd,void *vptr,size_t n);

int main(int argc,char * aregv)
{
int i,maxi,maxfd;//listenfd,connfd,sockfd;
SOCKET listenfd,connfd,sockfd;
int nready,client[FD_SETSIZE];
int n;
int testl;
// int iLength;
int flag=1;

char line[MAXLINE];
int clilen;
struct sockaddr_in cli_addr,serv_addr;
struct timeval timeout;
//char msg[]="hello";

fd_set rset,allset,wset,excset;
WSADATA wsaData;

timeout.tv_sec=0;
timeout.tv_usec=5;

if (WSAStartup (WINSOCK_VERSION, &wsaData) != 0)
{
printf("init failure!\n");
return 1;
}

listenfd=socket(AF_INET,SOCK_STREAM,0);//Greate socket
if(listenfd<0)
{
printf("socket error\n");
exit(1);
}
memset(&serv_addr,0,sizeof(serv_addr));
serv_addr.sin_family=AF_INET;
serv_addr.sin_addr.s_addr=htonl(INADDR_ANY);
serv_addr.sin_port=htons(SERV_PORT);
/*
if (ioctlsocket(listenfd, FIONBIO, &flag) != 0)
{
printf("set Error");
closesocket(listenfd);
}
*/
if(bind(listenfd,(struct sockaddr *)&serv_addr,sizeof(serv_addr))==-1)//bind
{
printf("bind error\n");
exit(0);
}
if(listen(listenfd,LISTENQ)==-1)
{
printf("listen error\n");
exit(0);
}
maxfd=listenfd;
maxi=-1;
for(i=0;i<FD_SETSIZE;i++)
client[i]=-1;
FD_ZERO(&allset);
FD_SET(listenfd,&allset);

for(;;)
{
//line[0]='\0';
rset=allset;
nready=select(maxfd+1,&rset,NULL,NULL,&timeout);//wait event occur
if(nready<0)
{
printf("select error\n");
exit(0);
}
// printf("--->%d\n",nready);
//FD_SET(listenfd,&rset);
if(FD_ISSET(listenfd,&rset))
{
clilen=sizeof(cli_addr); //new clinet connection
connfd=accept(listenfd,(struct sockaddr *)&cli_addr,&clilen);
if(connfd<0)
{
printf("connect error\n");
return -1;
}
printf("recevied a connetion from %s\n",inet_ntoa(cli_addr.sin_addr));

for(i=1;i<FD_SETSIZE;i++)
{
if(client[i]<0)
{
client[i]=connfd;
break;
}
}
printf("%d\n",client[1]);
printf("%d\n",client[2]);
printf("%d\n",client[3]);
printf("%d\n",client[4]);
if(i==FD_SETSIZE)
{
printf("too many clients\n");
exit(1);
}
FD_SET(connfd,&rset);

if(connfd>maxfd)
maxfd=connfd;

if(i>maxi)
maxi=i;


}
//for(i = 0;i <= 9;i++)

if(--nready <= 0) //不停的等待连接
continue;

for(i =0;i <= maxi;i++)
{
if((sockfd = client[i])<0)
continue;
FD_SET(sockfd,&rset);

if(FD_ISSET(sockfd,&rset)){//sockfd 有没有被设置
if((n = recv(sockfd,line,MAXLINE,0))!=-1)
{
for(i = 0;i < n;i++)
{
if(line[i]!= '\0')
printf("%c",line[i]);
}
line[i]='\0';
printf("\n");
testl=send(sockfd,line,strlen(line),0);
}
else{
closesocket(sockfd);
FD_CLR(sockfd,&allset);
client[i] = -1;

}
// printf("\n");

/*
else
writen(sockfd,line,n);
*/
}


//closesocket(sockfd); //服务器关闭了连接,等待下一个连接。
/*
if(--nready <=0)
break;
*/
}

}
WSACleanup();
return 0;

}




















































/*
int readline(int fd,void *vptr,size_t n)
{
size_t nleft;
size_t nread;
char *ptr;
ptr=vptr;
nleft=n;
while(nleft>0)
{
if((nread=read(fd,ptr,nleft))<0)
{
if(errno==EINTR)
nread=0;
else
return-1;

}
else if(nread==0)
break;
nleft-=nread;
ptr+=nread;

}
return (n-nleft);
}

int writen(int fd,const void *vptr,size_t n)
{
const char *ptr;
size_t nleft;
size_t nwritten;

ptr=vptr;
nleft=n;
while(nleft>0){
if((nwritten=write(fd,ptr,nleft))<=0){
if(errno==EINTR)
nwritten=0;
else
return -1;
}
nleft-=nwritten;
ptr+=nwritten;
}
return n;

}*/



















































jltx 2003-10-21
  • 打赏
  • 举报
回复
如果你是多cpu的机器当然可以同时进行。否则,肯定是一个一个的来处理。
如果你想更具体的了解,请看操作系统原理。
Weigehoho 2003-10-21
  • 打赏
  • 举报
回复
帮你up
gracian 2003-10-21
  • 打赏
  • 举报
回复
客户端多个能同时连而服务器端不能同时处理
flowerlee 2003-10-21
  • 打赏
  • 举报
回复
up
hawk_yz 2003-10-20
  • 打赏
  • 举报
回复
不用多线程,采用SELECT IO 模型是可以的,类似于重叠IO操作。

你看看SELECT 的设置有没有问题。FD_SET()等函数的使用是不是正确呀?


gracian 2003-10-20
  • 打赏
  • 举报
回复
是的,我用的,一个服务器和一个客户端的通信已经可以了,可是我想多开两个客户端同时连接到服务器上并能同时往服务器上发消息,感觉就是要一个个的来才行,不能同时进行。
哪个高手能指点一下啊
Weigehoho 2003-10-20
  • 打赏
  • 举报
回复
用winsock就成了,便一个简单的程序还是没问题的

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧