#include "commhead.h"
struct userinfo{
char userName[32];
char passWord[32];
};
struct userinfo users[]={
{"linux","linux"},
{"admin","admin"},
{" "," "}
};
/*
*find user in user table ,return -1,on error,return user on success
*其实我们有更好的处理用户信息的方法!在这里我们暂时还是这样使用!
* */
int findName(const char *userName)
{
int i;
if(NULL == userName){
printf("The name is empty!\n");
return -1;
}
/*
*Loop in user table to find the user!
* */
for(i = 0; users[i].userName[0] != ' ';i++){
if(!strcmp(userName,users[i].userName)){
return i;
}
}
printf("The user is invalid!\n");
return -1;
}
void sendData(int conn_fd,const char *string)
{
ssize_t nleft;
ssize_t nwrite;
/*if(send(conn_fd,string,sizeof(string),0) < 0){
perror("send");
exit(-1);
} */
nleft = strlen(string);
printf("send data %s with length %d\n",string,nleft);
while(nleft > 0){
if((nwrite = send(conn_fd,string,nleft,0)) < 0){
perror("send");
exit(-1);
}
nleft -= nwrite;
}
}
int main(int argc,char **argv)
{
int serverFd,connectFd;
int optionValue;
int flagRecv = USER_NAME;
int ret;
int nameNum;//the number in user table
pid_t pid;
socklen_t addrLen;
struct sockaddr_in clientAddr,serverAddr;
char recvBuf[128];
static char ipBuf[33];
addrLen = sizeof(struct sockaddr_in);
if((serverFd = socket(AF_INET,SOCK_STREAM,0)) < 0){
perror("socket");
exit(EXIT_FAILURE);
}
memset(&serverAddr,0,sizeof(struct sockaddr_in));
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(SERVER_PORT);
serverAddr.sin_addr.s_addr = htonl(INADDR_ANY);
optionValue = 1;
if(setsockopt(serverFd,SOL_SOCKET,SO_REUSEADDR,&optionValue,sizeof(optionValue)) < 0){
perror("setsockopt");
exit(EXIT_FAILURE);
}
if(bind(serverFd,(struct sockaddr *)&serverAddr,addrLen) < 0){
perror("bind");
exit(EXIT_FAILURE);
}
if(listen(serverFd,LISTEN_NUM) < 0){
perror("listen");
exit(EXIT_FAILURE);
}
//printf("The server is running...,we are listening...\n");
while(1){
printf("The server is running...,we are listening...\n");
if((connectFd = accept(serverFd,(struct sockaddr*)&clientAddr,&addrLen)) < 0){
perror("accept");
exit(EXIT_FAILURE);
}
if(inet_ntop(AF_INET,(char *)&clientAddr.sin_addr.s_addr,ipBuf,sizeof(ipBuf)) == NULL){
perror("inet_pton");
exit(EXIT_FAILURE);
}
printf("accept a new client, ip:%s\n",ipBuf);
if((pid = fork()) < 0){
perror("fork");
exit(EXIT_FAILURE);
}
if(pid == 0){
// child process begin
flagRecv = USER_NAME;
while(1){
if((ret = recv(connectFd,recvBuf,sizeof(recvBuf),0)) < 0){
perror("recv");
exit(EXIT_FAILURE);
}
recvBuf[ret - 1] = '\0';
if(flagRecv == USER_NAME){
if((nameNum = findName(recvBuf)) < 0){
sendData(connectFd,"n\n");
printf("The user name is invalid !\n");
}else{
sendData(connectFd,"y\n");
flagRecv = PASS_WORD;
printf("The user name is valid\n");
}
continue;
}
if(flagRecv == PASS_WORD){
if(!(strcmp(users[nameNum].passWord,recvBuf))){
sendData(connectFd,"y\n");
printf("send welcome to client!\n");
sendData(connectFd,"welcome login my tcp server\n");
printf("%s login\n",users[nameNum].userName);
break;
// printf("This is after break!\n");
}else{
sendData(connectFd,"n\n");
printf("The pass word is error!\n");
}
}
}//end second while
close(serverFd);
close(connectFd);
exit(EXIT_SUCCESS);
}
if( pid > 0){
close(connectFd);
printf("Close socket in parent process!\n");
}
}//end first while
return 0;//HERE maybe never reach ,because the process will exit before;
}
网络socket套接字编程服务器客户端程序
4星 · 超过85%的资源 需积分: 17 96 浏览量
2010-04-19
15:27:05
上传
评论 3
收藏 13KB RAR 举报
xiangpengmeng
- 粉丝: 45
- 资源: 63