1.服务器(不怎么会)
#include "head.h"
void insert_client(int* arr,int client,int* len)
{
arr[*len]=client;
(*len)++;
}
void remove_client(int* arr,int client,int* len)
{
int i=0,j=0;
for(i=0;i<*len;i++)
{
if(arr[i]==client);
break;
}
if(i==*len)
return;
for(j=i;j<*len;j++)
{
arr[j]=arr[j+1];
}
arr[j]=0;
(*len)--;
}
int main(int argc, const char *argv[])
{
if(argv<2)
{
printf("请输入端口号:\n");
return 1;
}
int port=atoi(argv[1]);//转变argv的数据类型
int server=socket(AF_INET,SOCK_STREAM,0);//创建套接字
struct sockaddr_in addr={0};//初始化结构体
addr.sin_family=AF_INET;//固定搭配
addr.sin_port=htons(port);//将点分十进制转化为十进制
addr.sin_addr.s_addr=inet addr("0.0.0.0");
if(bind(server,(struct sockaddr*)&addr,sieof(addr))==-1)//将IP和port放入套接字
{
perror("bind");
return 1;
}
listen(server,50);//监听
int client_arr[64]={0};//存放客户端
int arr_len=0;//数组长度
fd_set readfds;//创建select监视列表
FD_ZERO(&readfds;//初始化列表
//监视描述符
FD_SET(server,&readfds);
FD_SET(STDIN FILENO,&readfds);
while(1)
{
fd_set temp=readfds;
select(1024,&temp,0,0,0);
if(FD_ISSET(0,&temp))
{
char buf[1024]="";
scanf("%s",buf);
getchar();
printf("键盘输入数据:%s\n",buf);
}
if(FD_ISSET(server,&temp))
{
int client = accept(server,0,0);
printf("有新客户端连接\n");
FD_SET(client,&readfds);
insert_client(client_arr,client,&arr_len);
}
for(int i=0;i<arr_len;i++)
{
int client=client_arr[i];
if(FD_ISSET(client,&temp))
{
pack_t pack={0};
int size=0;
int res=read(client,&size,4);
if(res==0)
{
printf("客户端断开连接\n");
FD_CLR(client,&readfds);
remove_client(client_arr,client,&arr_len);
close(client);
break;
}
read(client,(char*)&pack+4,size-4);
char** list=analysis(pack);
printf("%s\n",list[0]);
printf("%s\n",list[1]);
freeList(list);
}
}
}
return 0;
}
2.客户端1
#include "head.h"
typedef struct pack{
char name[20];
char pswd[20];
char text[168];
}pack_t;
int main(int argc, const char *argv[])
{
if(argv<2)
{
printf("please inter port:\n");
return 1;
}
int port=atoi(argv[1]);
int client = socket(AF_INET,SOCK_STREAM,0);
struct socketaddr_in addr ={0};
addr.sin_family=AF_INET;
addr.sin_port=htons(port);
addr.sin_addr.s_addr=inet_addr("192.168.125.128");
if(connect(client,(struct sockaddr*)&addr,sizeof(addr))==-1)
{
perror("connect");
return 1;
}
struct pollfd list[50]={0};
int list_len =0 ;
struct pollfd client_fd={fd:client,events:POLLOUT,revents:0};
struct pollfd stdin_fd={fd:0,events:POLLOUT,revents:0};
insert_server(list,client_fd,&list_len);
insert_server(list,stdin_fd,&list_len);
while(1)
{
poll(list,list_len,-1);
int i=0;
for(i=0;i<list_len;i++)
{
if(list[i].revents==0)
{
continue;
}
int fd=list[i].fd;
if(fd==0)
{
char buf[1024]="";
scanf("%s",buf);
getchar();
printf("please inter data:%s\n",buf);
}
else if(fd==client)
{
int server=connect(client,(struct sockaddr*)&addr,sizeof(addr));
struct pollfd client_fd={fd:server,events:POLLOUT,revents:0};
}
pack_t pack={0};
printf("please inter name:\n");
scanf("%19s",pack.name);
getchar();
printf("please inter pswd:\n");
scanf("%19s",pack.pswd);
getchar();
printf("please inter text:\n");
scanf("%19s",pack.text);
getchar();
write(client,&pack,sizeof(pack));
}
return 0;
}