4 回答

TA貢獻257條經驗 獲得超93個贊
#include?<stdio.h> #include?<strings.h> #include?<unistd.h> #include?<sys/types.h> #include?<sys/socket.h> #include?<netinet/in.h> #include?<arpa/inet.h> #include?<sys/time.h> #include?<stdlib.h> ? #include?<string.h> ? #define?PORT?1234 #define?BACKLOG?5 #define?MAXDATASIZE?1000 ? typedef?struct?CLIENT{ ????int?fd; ????char?*name; ????struct?sockaddr_in?addr; ????char?*data; }; void?process_cli(CLIENT?*client,char?*recvbuf,int?len); void?savedata(char?*recvbuf,int?len,char?*data); ? int?main(){ ????int?i,maxi,maxfd,sockfd; ????????CLIENT?client[FD_SETSIZE]; ????int?nready; ????ssize_t?n; ????fd_setrset,allset; ????int?listenfd,connectfd; ????struct?sockaddr_in?server; ????char?recvbuf[MAXDATASIZE]; ????int?sin_size; ??????? ????if((listenfd=socket(AF_INET,SOCK_STREAM,0))==-1){ ????????perror("Creating?socket?falied."); ????????exit(1); ????} ????int?opt=SO_REUSEADDR; ????setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt)); ????? ????bzero(&server,sizeof(server)); ????server.sin_family=AF_INET; ????server.sin_port=htons(PORT); ????server.sin_addr.s_addr=htonl(INADDR_ANY); ????if(bind(listenfd,(struct?sockaddr?*)&server,sizeof(struct?sockaddr))==1){ ????????perror("Bind?error."); ????????exit(1); ????} ????if(listen(listenfd,BACKLOG)==-1){ ????????perror("listen()?error.\n"); ????????exit(1); ????} ????sin_size=sizeof(struct?sockaddr_in); ????maxfd=listenfd; ????maxi=-1; ????for(i=0;i<FD_SETSIZE;i++){ ????????client[i].fd=-1; ????} ????FD_ZERO(&allset); ????FD_SET(listenfd,&allset); ? ????while(1){ ????????struct?sockaddr_in?addr; ????????rset=allset; ????????nready=select(maxfd+1,&rset,NULL,NULL,NULL); ? ????????if(FD_ISSET(listenfd,&rset)){ ????????????if((connectfd=accept(listenfd,(struct?sockaddr?*)&addr,&sin_size))==-1){ ????????????????perror("accept()?error\n"); ????????????????continue; ????????????} ????????????for(i=0;i<FD_SETSIZE;i++) ????????????????if(client[i].fd<0){ ????????????????????client[i].fd=connectfd; ????????????????????client[i].name=new?char[MAXDATASIZE]; ????????????????????????????????????????//client[i].name=(char?*)malloc(MAXDATASIZE); ????????????????????????????????????????//stu[i].name=(char?*)malloc(MAXDATASIZE); ????????????????????client[i].addr=addr; ????????????????????client[i].data=new?char[MAXDATASIZE]; ????????????????????????????????????????//stu[i].snum=(char?*)malloc(MAXDATASIZE); ????????????????????client[i].name[0]='\0'; ????????????????????client[i].data[0]='\0'; ????????????????????????????????????????//stu[i].name[0]='\0'; ????????????????????????????????????????//stu[i].snum[0]='\0'; ????????????????????printf("You?got?a?connection?from?%s.",inet_ntoa(client[i].addr.sin_addr)); ????????????????????break; ????????????????} ????????????????if(i==FD_SETSIZE) ????????????????????printf("too?many?clients\n"); ????????????????FD_SET(connectfd,&allset); ????????????????if(connectfd>maxfd) ????????????????????maxfd=connectfd; ????????????????if(i>maxi) ????????????????????maxi=i; ????????????????if(--nready<=0) ????????????????????continue; ????????} ????????for(i=0;i<=maxi;i++){ ????????????if((sockfd=client[i].fd)<0)) ????????????????continue; ????????????if(FD_ISSET(sockfd,&rset)){ ????????????????if((n=recv(sockfd,recvbuf,MAXDATASIZE,0))==0){ ????????????????????close(sockfd); ????????????????????printf("Client(%s)?closed?connection.User's?data:%s\n",client[i].name,client[i].data); ????????????????????FD_CLR(sockfd,&allset); ????????????????????client[i].fd=-1; ???????????????????????????????????????//?free(stu[i].name); ????????????????????????????????????????//free(stu[i].data); ????????????????????free(client[i].name); ????????????????????free(client[i].data); ????????????????}else ????????????????????process_cli(&client[i],recvbuf,n); ????????????????if(--nready<=0) ????????????????????break; ????????????????} ????????????} ????????} ????????close(listenfd); } ? void?process_cli(CLIENT?*client,char?*recvbuf,int?len){ ????char?sendbuf[MAXDATASIZE]; ????recvbuf[len-1]='\0'; ????if(strlen(client->name)==0){ ????????memcpy(client->name,recvbuf,len); ????????printf("Client's?name?is:%s.\n",client->name); ????????return; ????} ????printf("Received?client(%s)?message:%s\n",client->name,recvbuf); ????savedata(recvbuf,len,client->data); ????for(int?i1=0;i1<len-1;i1++){ ????????sendbuf[i1]=recvbuf[len-i1-2]; ????} ????sendbuf[len-1]='\0'; ????send(client->fd,sendbuf,strlen(sendbuf),0); } ? void?savedata(char?*recvbuf,int?len,char?*data){ ????int?start=strlen(data); ????for(int?i=0;i<len;i++){ ????????data[start+i]=recvbuf[i]; ????} }

TA貢獻1017條經驗 獲得超1032個贊
typedef?struct?CLIENT{ ????int?fd; ????char?*name; ????struct?sockaddr_in?addr; ????char?*data; };
你這里要將struct CLIENT結構體類型自定義成什么類型也沒有指定,?CLIENT?client[FD_SETSIZE];這里也沒有指定為struct??CLIENT?client[FD_SETSIZE];

TA貢獻22條經驗 獲得超7個贊
我用VS2008 編譯的,沒有出現你說的問題,是其他報錯;修改后:
#include <winsock2.h>
#pragma comment (lib,"ws2_32.lib")
#define MAXDATASIZE 1024
typedef struct CLIENT{
int fd;
char *name;
struct sockaddr_in addr;
char *data;
};
void process_cli(CLIENT *client,char *recvbuf,int len);
void savedata(char *recvbuf,int len,char *data);
int main(){
int i,maxi,maxfd,sockfd;
int nready;
//ssize_t n;
//fd_setrset,allset;
int listenfd,connectfd;
struct sockaddr_in server;
CLIENT client[FD_SETSIZE];
char recvbuf[MAXDATASIZE];
}

TA貢獻883條經驗 獲得超454個贊
如果這是 C 代碼,那么你并沒有把?struct?CLIENT 定義為類型,typedef 的用法沒寫對。
14 行那里?fd_setrset,allset 缺少類型。
還有,看后面的報錯,你寫了?new char[MAXDATASIZE]; 這樣的代碼???? 你確定你寫的是 C??
- 4 回答
- 1 關注
- 11659 瀏覽
添加回答
舉報