4.18

#include <stdio.h>
#include <stdlib.h>
#include <error.h>
#include <fcntl.h>
#include <sys/stat.h>


/*Internet*/
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <sys/un.h>
#include <netinet/in.h>
/*Pthread*/
#include <pthread.h>


#define PORT 8888
#define ERR(m)\
do{\
perror(m);\
exit(EXIT_FAILURE);\
}while(0)




struct online{
int clientfd;
char name[20];
char password[20];


struct online *next;
};




struct message{
int action;
char name[20];
char password[10];
char toname[20];
char msg[1024];
};


enum action{
REGIN = 1,
REGSUC,
REGFAIL,
LOGIN,
LOGSUC,
LOGFAIL,
FINDNAME,
FINDSUC,
FINDFAIL,
CHATOUT,
CHATIN,
SENDALL,
NOOTHER,
DISALL,
DISALLSUC,
};




typedef struct online Online;
typedef struct online * Link;




void create_link(Link *head);
void create_newnode(Link *newnode);
void is_malloc_ok(Link *newnode);
void insert_node(Link newnode);
void * read_msg(void *arg);
int is_login(struct message msg);
int findname(struct message msg);
void chat(struct message msg);
void sendall(struct message msg);
void displayall(struct message msg);
//void file_read(void );
Link head;


int main()
{
int listenfd;
int sockfd;


pthread_t pid;




head = (Link)malloc(sizeof(Online));
head->next = head;

//file_read();


struct sockaddr_in server_addr;
    struct sockaddr_in client_addr;
socklen_t serverlen = sizeof(struct sockaddr_in);
socklen_t clientlen = sizeof(struct sockaddr_in);


if((listenfd = socket(AF_INET,SOCK_STREAM,0)) < 0)
ERR("------socket error:");
else
printf("------socket successfully !\n");


//bzero(&server_addr,sizeof(struct sockaddr_in));
memset(&server_addr,0,sizeof(struct sockaddr_in));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(PORT);
server_addr.sin_addr.s_addr =htonl(INADDR_ANY);


int opt = 1;
if(setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt)) < 0)
ERR("------setsockopt error:");
else
printf("------setsockopt successfully !\n");


if(bind(listenfd,(struct sockaddr *)&server_addr,sizeof(struct sockaddr_in)) < 0)
ERR("------bind error:");
else
printf("------bind successfully !\n");


if(listen(listenfd,SOMAXCONN) < 0)
ERR("------listen error:");
else
printf("------listen successfully !\n");




while(1)
{
if((sockfd = accept(listenfd,(struct sockaddr*)&client_addr,&clientlen)) < 0)
ERR("------accept error:");
else
printf("------accept successfully!\n");
printf("********IP : %s --- PORT : %d ------ ONLINE\n",inet_ntoa(client_addr.sin_addr),ntohs(client_addr.sin_port));
pthread_create(&pid,NULL,read_msg,(void *)sockfd);
}


    return 0;
}
/*
void file_read(void )
{
Link temp;
FILE *fp;


temp = head->next;


if((fp = fopen("liaotianshi.txt","w")) == NULL)
ERR("open file error:");

fseek(fp,0,SEEK_SET);

create_newnode(&new_node);
fread(newnode,sizeof(Online),1,fp);
insert_node(new_node);
while(!feof(fp))
{
create_newnode(&new_node);
fread(newnode,sizeof(Online),1,fp);
insert_node(new_node);
}
while(temp != head)
{
printf("++++++++++++++++++++++++++++++++++++%s\n",temp->name);
temp = temp->next;
}
temp = head->next;
fclose(fp);


}
*/
void create_link(Link *head)
{
create_newnode(head);
(*head)->next = (*head);
}


void create_newnode(Link *newnode)
{
(*newnode) = (Link)malloc(sizeof(Online));
is_malloc_ok(newnode);
}


void is_malloc_ok(Link *newnode)
{
if(*newnode == NULL)
ERR("------malloc error:");
}


void insert_node(Link newnode)
{
newnode->next = head->next;
head->next = newnode;
}




void * read_msg(void *arg)
{
int sockfd = (int)arg;


Link new_node;
int n_read;
struct message msg;
memset(&msg,0,sizeof(struct message));


while(1)
{
memset(&msg,0,sizeof(struct message));
n_read = recv(sockfd,&msg,sizeof(struct message),0);
if(n_read <= 0)
{
printf("------client quit %d!\n",n_read);
break;
}


printf("++++++++++++++++++++++++++++++++++++++++%s  %s\n",msg.name,msg.toname);
switch(msg.action)
{
case REGIN:{
  create_newnode(&new_node);
  new_node->clientfd = sockfd;
  strcpy(new_node->name,msg.name);
  strcpy(new_node->password,msg.password);
  insert_node(new_node);
  msg.action = REGSUC;
  send(sockfd,&msg,sizeof(struct message),0);
  printf("------already register  %d\n",new_node->clientfd);
      break;
      }
case LOGIN:{
  if(is_login(msg))
  {
  msg.action = LOGSUC;
  send(sockfd,&msg,sizeof(struct message),0);
  printf("------already login\n");
  break;
  }
  else
  {
  msg.action = LOGFAIL;
  send(sockfd,&msg,sizeof(struct message),0);
  printf("------there is no this people\n");
  break;
  }
  }
case FINDNAME:{
 if(findname(msg))
 {
 msg.action = FINDSUC;
 send(sockfd,&msg,sizeof(struct message),0);
 printf("------find successfully !\n");
 break;
 }
 else
 {
 msg.action = FINDFAIL;
 send(sockfd,&msg,sizeof(struct message),0);
 printf("------find failure !\n");
 break;
 }
 }
case CHATOUT:{
printf("(((((((((%s)))))))))\n",msg.toname);
    chat(msg);
    printf("1111111111111111\n");
    break;
    }
case SENDALL:sendall(msg);break;
case DISALL:displayall(msg);break;
default:break;
}
}
}


void displayall(struct message msg)
{
Link temp;
temp = head->next;
int tofd;


if(temp->next == head)
{
if(strcmp(msg.name,temp->name) == 0)
{
tofd = temp->clientfd;
}
}
else
{
while(temp != head)
{
if(strcmp(temp->name,msg.name) == 0)
{
tofd = temp->clientfd;
break;
}
temp = temp->next;
}
}


temp = head->next;
if(temp->next == head)
{
msg.action = DISALLSUC;
strcpy(msg.toname,temp->name);
send(tofd,&msg,sizeof(struct message),0);
}
else
{
while(temp != head)
{
msg.action = DISALLSUC;
   strcpy(msg.toname,temp->name);
send(tofd,&msg,sizeof(struct message),0);
sleep(1);
temp = temp->next;
}
}

}


void sendall(struct message msg)
{
Link temp;
temp = head->next;
int tofd;


if(temp->next == head)
{
if(strcmp(msg.name,temp->name) == 0)
{
msg.action = NOOTHER;
tofd = temp->clientfd;
send(tofd,&msg,sizeof(struct message),0);
}
}
else
{
while(temp != head)
{
if(strcmp(temp->name,msg.name) != 0)
{
msg.action = CHATIN;
tofd = temp->clientfd;
send(tofd,&msg,sizeof(struct message),0);
}
temp = temp->next;
}
}
}


void chat(struct message msg)
{
Link temp;
int tofd;


temp = head->next;

while(temp != head)
{
printf("++++++++++++++++++++++++++++++++++++%s\n",temp->name);
temp = temp->next;
}
temp = head->next;


if(temp->next == head)
{
if(strcmp(temp->name,msg.toname) == 0)
{
//printf("22222222222222222222\n");
tofd = temp->clientfd;
msg.action = CHATIN;
send(tofd,&msg,sizeof(struct message),0);
//printf("33333333333333333333333\n");
}
}
else
{
//printf("((((((((((((((((((((()))))))))))))))))))))");
while(temp != head)
{
// printf("%s\n",msg.toname);
if(strcmp(temp->name,msg.toname) == 0)
{
//printf("444444444444444444\n");
tofd = temp->clientfd;
msg.action = CHATIN;
printf("++++++++++++++++++++++++++++++++++++++++++++++%s\n",temp->name);
send(tofd,&msg,sizeof(struct message),0);
//printf("555555555555555555\n");
}
temp = temp->next;
}
}
}


int findname(struct message msg)
{
Link temp;
int flag = 0;


temp = head->next;
if(temp->next == head)
{
if(strcmp(temp->name,msg.toname) == 0)
flag = 1;
}
else
{
while(temp != head)
{
if(strcmp(temp->name,msg.toname) == 0)
{
flag = 1;
break;
}


temp = temp->next;
}
}


return flag;
}


int is_login(struct message msg)
{
int flag = 0;
Link temp;
temp = head->next;

if(temp->next == head)
{
if(strcmp(msg.name,temp->name) == 0)
{
if(strcmp(msg.password,temp->password) == 0)
flag = 1;
}
}
else
{
while(temp->next !=  head)
{
if(strcmp(msg.name,temp->name) == 0)
{
if(strcmp(msg.password,temp->password) == 0)
{
flag = 1;
break;
}
}
temp = temp->next;
}
}


return flag;
}
Selenium是一个用于自动化Web浏览器的工具它可以模拟用户在浏览器中的操作,例如点击、输入文本等。Selenium 4.18是Selenium的一个版本,它提供了一些新的功能和改进。 以下是Selenium 4.18的一些用法介绍: 1. 安装Selenium 4.18:你可以通过pip命令来安装Selenium 4.18,例如:`pip install selenium==4.18` 2. 创建WebDriver对象:在使用Selenium之前,你需要创建一个WebDriver对象,它可以控制浏览器的行为。你可以选择使用不同的浏览器驱动程序,如ChromeDriver、FirefoxDriver等。 3. 打开网页:使用WebDriver对象的`get()`方法可以打开指定的网页,例如:`driver.get("https://www.example.com")` 4. 查找元素:使用WebDriver对象的`find_element()`或`find_elements()`方法可以查找页面上的元素。你可以使用不同的定位方式来定位元素,如ID、类名、XPath等。 5. 操作元素:一旦找到了元素,你可以对其进行各种操作,如点击、输入文本等。例如,使用`click()`方法可以点击一个元素,使用`send_keys()`方法可以向一个输入框中输入文本。 6. 等待元素:有时候页面上的元素可能需要一些时间才能加载出来,你可以使用WebDriver对象的等待方法来等待元素的出现或消失。 7. 处理弹窗:有些网页可能会弹出警告框或确认框,你可以使用WebDriver对象的`switch_to.alert`方法来处理这些弹窗。 8. 截图:使用WebDriver对象的`screenshot()`方法可以对当前页面进行截图,你可以保存截图或进行其他操作。 9. 关闭浏览器:使用WebDriver对象的`quit()`方法可以关闭浏览器。 这些只是Selenium 4.18的一些基本用法介绍,Selenium还提供了更多的功能和方法,你可以根据具体需求进行学习和使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值