4 回答
TA贡献257条经验 获得超92个赞
#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 关注
- 11514 浏览
添加回答
举报