社区
C语言
帖子详情
关于网络编程的,想高手来指点一下
gracian
2003-10-20 03:27:35
不知道不用多线程能不能做一个象聊天室那样的程序来?不用界面,就用c来写的,调用 win api函数,我用select,好象不怎么行,也设置了非阻塞模式。谁能告诉我个思路,我感觉比较乱:(。
...全文
81
11
打赏
收藏
关于网络编程的,想高手来指点一下
不知道不用多线程能不能做一个象聊天室那样的程序来?不用界面,就用c来写的,调用 win api函数,我用select,好象不怎么行,也设置了非阻塞模式。谁能告诉我个思路,我感觉比较乱:(。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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就成了,便一个简单的程序还是没问题的
home.rar_Home Home_anywaykbk_
网络编程
数字滤波器设计,是有限冲击长响应的滤波器,希望各位
高手
指点
网吧计费管理软件代码
我是一个编程爱好者,还未入门,网吧计费是参照网上资料开始学习DELPHI语言的一个蠢作,希望得到
高手
指点
和交流,我的QQ是“110304662”,“贾铭”。有关密码为:服务端:为 “1”。客户端:为机器的月份+日期。 如...
windows
网络编程
之tcp/ip
适用人群 windows
网络编程
的初学者 课程概述 课程简介: 这部教程是windows
网络编程
课程的第一部分课程:tcp/ip协议 后续会有第二部分课程:udp/ip协议以及第三部分课程http协议的课程发布。希望能够帮助到大家。 ...
DIY机器人.pdf
对于网络,还是希望大家能多利用
一下
,很多问题不是非要到论坛来问的, 首先你要学会 自己找答案,比如 google、百度都是很好的搜索引擎,你只要输入关键字就 能找到很多相 关资料,别老是等待别人给你希望,看的出...
游戏画面就弹出内存不能为read修复工具
你可以使用MemTest 这个软件来检测
一下
内存,它可以彻底的检测出内存的稳定度。 二、如果都没有,那就从软件方面排除故障了。 先说原理:内存有个存放数据的地方叫缓冲区,当程序把数据放在缓冲区,需要操作系统...
C语言
69,371
社区成员
243,080
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章