你好,这是一个创建聊天群的一个项目,上面是客户端,下面是服务器,想实现在客户段发送指令到服务器来实现聊天的功能,但现在上面客户端编译一直显示拒绝链接,服务器报段错误核心转储,也无法和在一起进行输出实现功能,暂时就这些,希望帮帮我,感谢感谢。
这是我的客户端hread.c文件
#include "hread.h"
int main()
{
pthread_t thread;
//客户端
struct sockaddr_in serv_addr;
char buf[BUFFSIZE],temp[BUFFSIZE];
//初始化服务端的地址结构
bzero(&serv_addr,sizeof(struct sockaddr_in));
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(PORT);
inet_pton(AF_INET,HOST_IP, &serv_addr.sin_addr);
//创建客户端
sockfd = socket(AF_INET,SOCK_STREAM,0); //转变为全局变量,供snd函数使用
if(sockfd < 0)
{
perror("发送到套接字");
exit(-1);
}
//与服务器建立连接
printf("连接... \n");
if(connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(serv_addr)) < 0)
{
perror("连接失败");
exit(-2);
}
printf("enter \"login\" to login\n");
printf("enter \"register\" to create an account\n");
printf("enter \"quit\" to quit\n");
printf("enter \"help\" to get more help\n\n");
pthread_create(&thread,NULL,(void *)(&snd),NULL);
while(1)
{
int len;
if ((len = read(sockfd,buf,BUFFSIZE)) > 0)
{
write(1,buf,len);
printf("\n");
}
}
return 0;
}
void snd()
{
char buf[BUFFSIZE];
while(1)
{
fgets(buf,BUFFSIZE,stdin);
if(strcmp(buf,"help\n") == 0)
{
get_help();
continue;
}
if(strcmp(buf,"\n") != 0)
write(sockfd,buf,strlen(buf));
if(strcmp(buf,"quit\n") == 0)
exit(0);
}
}
void get_help()
{
printf("Commands introduction:\n"); //命令简介
printf("\t'ls -users':\t\tshow all online users\n");
printf("\t'ls -chatrooms':\tshow all chat rooms\n");
printf("\t'ls -inrmusr'\t\tshow all online users in chat room you joined\n");
printf("\t'send username msg':\tsend a message to the user named 'username' msg:the content of the message\n");
printf("\t'join chatroom passwd':\tjoin in a chat room named 'chatroom' with password 'passwd'\n");
printf("\t'create chatname passwd':\tcreate a chat room named 'chatname' with password 'passwd'\n");
printf("\t'chgpsw passwd':\t\tchange your password to 'passwd'\n");
printf("\t'send -chatroom msg':\tsend a message to the chat room\n");
printf("\t'exit':\t\t\texit the chat room you joined\n");
printf("\t'send -all msg':\tsend a message to all online users\n");
printf("\t'login':\t\tlogin chat system\n");
printf("\t'register':\t\tcreate an account\n");
printf("\t'quit':\t\t\texit chat system\n");
printf("\t'help':\t\t\tget more help information\n\n");
}
这是我的服务器tcp.c文件
#include "tcp.h"
//服务器主函数
int main()
{
init();
//服务器
struct sockaddr_in serv_addr,cli_addr;
int i;
socklen_t len; //修改为socklen_t类型
time_t timenow;
pthread_t thread;
char buff[BUFFSIZE];
printf("运行中...\n输入命令“quit”退出服务器。\n\n");
bzero(&serv_addr,sizeof(struct sockaddr_in));
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(PORT);
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
listenfd = socket(AF_INET, SOCK_STREAM,0);
if(listenfd < 0)
{
perror("创建套接字失败");
exit(-1);
}
if(bind(listenfd,(struct sockaddr *)&serv_addr,sizeof(serv_addr)) < 0)
{
perror("绑定套接字失败");
exit(-2);
}
listen(listenfd,MAXMEM);
//创建一个线程,对服务器程序进行管理,调用quit函数
pthread_create(&thread,NULL,(void *)(quit),NULL); //修改为取地址符号&
//将套接字描述符数组初始化为-1,表示空闲
for(i = 0;i < MAXMEM;i++)
connfd[i] = -1;
while(1)
{
for(i = 0; i< MAXMEM; i++)
{
if(connfd[i] == -1)
break;
}
len = sizeof(cli_addr); //修改socklen_t 类型
//accept从listen接受的连接列中取得一个链接
connfd[i] = accept(listenfd,(struct sockaddr *)&cli_addr,&len);
if(connfd[i] < 0)
{
perror("不接受.");
}
timenow =time(NULL);
printf("%.24s\n\tconnect from:%s,port %d\n",ctime(&timenow),inet_ntop(AF_INET,&(cli_addr.sin_addr),buff,BUFFSIZE),ntohs(cli_addr.sin_port));
//创建一个线程,对消息进行处理
pthread_t *thread = malloc(sizeof(pthread_t));
uintptr_t arg = (uintptr_t)i;
pthread_create(thread, NULL, (void*(*)(void*))&rcv_snd, (void *)arg); //修改为取地址符号&
}
return 0;
}
//服务器接收和发送
void rcv_snd(int n)
{
ssize_t len;
int i;
char mytime[32],buf[BUFFSIZE];
char temp[BUFFSIZE];
char command[20],arg1[20],arg2[BUFFSIZE];
time_t timenow;
while(1)
{
len = read(connfd[n],buf,BUFFSIZE);
if(len > 0)
{
buf[len - 1] = '\0'; //去掉换行符
if(strcmp(buf,"login") == 0)
{
if(user_login(n) == 0) //登陆成功退出循环
{
break;
}
}
else
if (strcmp(buf,"register") == 0)
{
register_user(n);
}
else
if (strcmp(buf,"quit") == 0)
{
quit_client(n);
}
}
}
while(1)
{
if ((len = read(connfd[n],temp,BUFFSIZE)) > 0)
{
temp[len - 1] = '\0';
sscanf(temp,"%s %s %[^\n]",command,arg1,arg2); //解析命令
if (strcmp(command,"send") == 0 && strcmp(arg1,"-all") == 0)
{
send_all_msg(arg2,n);
}
else
if (strcmp(command, "send") == 0 && strcmp(arg1, "-chatroom") == 0)
{
send_all_msg(arg2,n);
}
else
if (strcmp(command,"send") == 0)
{
send_private_msg(arg1,arg2,n);
}
else
if (strcmp(command, "quit") == 0)
{
quit_client(n);
}
else
if (strcmp(command,"chgpsw") == 0)
{
change_passwd(n,arg1);
}
else
if (strcmp(command,"create") == 0)
{
create_chatroom(arg1,arg2,n);
}
else
if (strcmp(command,"join") == 0)
{
join_chatroom(arg1,arg2,n);
}
else
if (strcmp(command,"ls") == 0 && strcmp(arg1,"-chatrooms") ==0)
{
get_online_chatrooms(n);
}
else
if (strcmp(command,"ls") == 0 && strcmp(arg1,"-users") == 0)
{
get_online_users(n);
}
else
if(strcmp(command,"ls") == 0 && strcmp(arg1,"-inrmusr") == 0)
{
get_inroom_users(n);
}
else
if (strcmp(command,"exit") == 0)
{
exit_chatroom(n);
}
else
{
invalid_command(n);
}
}
}
}
//初始化
void init()
{
int i,j;
user_count = 0;
chatroom_count = 0;
for (i = 0; i < MAXMEM; i++)
{
online_users[i].status = -1;
}
for (i = 0; i < MAXROOM; i++)
{
chatrooms[i].status = -1;
for (j = 0; j < 10; j++)
{
chatrooms[i].user[j] = -1;
}
}
char buf[20];
FILE *fp =NULL;
fp = fopen("user.txt","r");
while (fscanf(fp, "%s",buf) != EOF) //从文件中读取用户
{
strcpy(users[user_count].username,buf);
fscanf(fp, "%s",buf);
strcpy(users[user_count].password,buf);
user_count++;
}
fclose(fp);
}
//将用户信息保存到文件
void save_users()
{
int i;
FILE *fp = NULL;
fp = fopen("users.txt","w+");
if (fp == NULL)
{
printf("无法打开文件");
return;
}
for (i = 0; i < user_count; i++)
{
fprintf(fp,"%s\n%s\n",users[i].username,users[i].password);
}
fclose(fp);
}
//服务器用户退出
void quit_client(int n)
{
int ret,i;
close(connfd[n]);
for (i = 0; i < MAXMEM; i++)
{
if (n == online_users[i].socketfd)
{
online_users[i].status = -1;
}
}
pthread_exit(&ret);
}
//用户登陆
int user_login(int n)
{
int len,i,j;
char buf[BUFFSIZE],username[20],password[20];
//发送用户名请求
sprintf(buf,"your username: ");
write(connfd[n],buf,strlen(buf) + 1);
len = read(connfd[n],username,20);
if (len > 0)
{
username[len - 1] = '\0';
}
//发送密码请求
sprintf(buf,"your password: ");
write(connfd[n],buf,strlen(buf) + 1);
len = read(connfd[n],password,20);
if (len > 0)
{
password[len - 1] = '\0';
}
//在用户列表中查找用户
for (i = 0; i < MAXMEM; i++)
{
if (strcmp(username,users[i].username) ==0)
{
if (strcmp(password,users[i].password) ==0)
{
//登陆成功,更新在线用户信息
sprintf(buf,"login successfully.\n\n");
write(connfd[n],buf,strlen(buf) + 1);
for (j = 0; j < MAXMEM; j++)
{
if (online_users[j].status == -1)
{
break;
}
}
strcpy(online_users[j].username,username);
online_users[j].socketfd = n;
online_users[j].status = 0;
return 0;
}
else
{
//密码错误
sprintf(buf,"Wrong password.\n\n");
write(connfd[n],buf,strlen(buf + 1));
return -1;
}
}
}
//用户名不存在
sprintf(buf,"Account does not exist.\n\n");
write(connfd[n],buf,strlen(buf + 1));
}
//用户注册
void register_user(int n)
{
int len, i;
char buf[BUFFSIZE],username[20],password[20];
sprintf(buf,"your username: ");
write(connfd[n],buf,strlen(buf) + 1);
len = read(connfd[n],username,20);
if (len > 0)
{
username[len - 1] = '\0';
}
sprintf(buf,"your password: ");
write(connfd[n],buf,strlen(buf) + 1);
len = read(connfd[n],password,20);
if (len > 0)
{
password[len - 1] = '\0';
}
for (i = 0; i < MAXMEM; i++)
{
if(strcmp(users[i].username,username) == 0)
{
strcpy(buf,"The username already exists.\n\n");
write(connfd[n],buf,strlen(buf) + 1);
return;
}
}
strcpy(users[user_count].username,username);
strcpy(users[user_count].password,password);
user_count++;
sprintf(buf,"Account created successfully.\n\n");
write(connfd[n],buf,strlen(buf) + 1);
}
//用户发送私聊信息
void send_private_msg(char *username,char *data,int sfd)
{
int i,j;
time_t now;
char send_man[20];
char buf[BUFFSIZE],nowtime[20],temp[30];
now = time(NULL);
time(&now);
struct tm *temptime = localtime(&now);
strftime(nowtime,20,"[%H:%M:%S]",temptime);
for (j = 0; j < MAXMEM; j++)
{
if (sfd == online_users[j].socketfd)
{
strcpy(send_man,online_users[j].username);
break;
}
}
for (i = 0; i < MAXMEM; i++)
{
if (strcmp(username,online_users[i].username) == 0)
{
strcpy(buf,nowtime);
strcat(buf,"\t");
strcat(buf,"from ");
strcat(buf,send_man);
strcat(buf,":\n");
strcat(buf,data);
strcat(buf,"\n");
write(connfd[online_users[i].socketfd],buf,strlen(buf) + 1);
strcpy(temp,"sent successfully.\n");
write(connfd[sfd],temp,strlen(temp) + 1);
return;
}
}
strcpy(buf,"用户不在线或不存在。\n");
write(connfd[sfd],buf,strlen(buf) + 1);
return;
}
//用户群发信息给所有人
void send_all_msg(char *msg,int sfd)
{
int i;
char buf[BUFFSIZE],nowtime[20],send_man[20],temp[30];
time_t now;
time(&now);
struct tm *temptime = localtime(&now);
strftime(nowtime,20,"[%H:%M:%S]",temptime);
for (i = 0; i < MAXMEM; i++)
{
if (sfd == online_users[i].socketfd)
{
strcpy(send_man,online_users[i].username);
break;
}
}
strcpy(buf,nowtime);
strcat(buf,"\t");
strcat(buf,"from ");
strcat(buf,send_man);
strcat(buf,"(goup-sent):\n");
strcat(buf,msg);
strcat(buf,"\n");
for (i = 0; i < MAXMEM; i++)
{
if (connfd[i] != -1 && i != sfd)
{
write(connfd[i],buf,strlen(buf) + 1);
}
}
strcpy(temp,"sent successfully\n");
write(connfd[sfd],temp,strlen(temp) + 1);
}
//获取在线用户信息
void get_online_users(int sfd)
{
int i;
char buf[BUFFSIZE],nowtime[20];
time_t now;
time(&now);
struct tm *temptime = localtime(&now);
strftime(nowtime,20,"[%H:%M:%S]",temptime);
strcpy(buf,nowtime);
strcat(buf,"\t");
strcat(buf,"All online user(s):\n");
for (i = 0; i < MAXMEM; i++)
{
if (online_users[i].status == 0)
{
strcat(buf,"\t");
strcat(buf,online_users[i].username);
strcat(buf,"\n");
}
}
write(connfd[sfd],buf,strlen(buf) + 1);
}
//向聊天室发送信息
void send_chatroom_msg(char *msg,int sfd)
{
int i,j,k;
int flag;
flag = -1;
char buf[BUFFSIZE],nowtime[20];
time_t now;
time(&now);
struct tm *temptime = localtime(&now);
strftime(nowtime,20,"[%H:%M:%S]",temptime);
for (i = 0; i < MAXROOM; i++)
{
if (chatrooms[i].status == 0)
{
for (j = 0; j < 10; j++)
{
if (chatrooms[i].user[j] == sfd)
{
flag = 0;
break;
}
}
}
if (flag == 0)
{
break;
}
}
if (flag == -1)
{
strcpy(buf,"you have not joined the chat room.\n");
write(connfd[sfd],buf,strlen(buf) + 1);
}
else
{
for (k = 0; k < MAXMEM; k++)
{
if (online_users[k].status == 0 && online_users[k].socketfd == sfd)
break;
}
strcpy(buf,nowtime);
strcat(buf,"\tchatroom ");
strcat(buf,chatrooms[i].name);
strcat(buf,":\nfrom ");
strcat(buf,online_users[k].username);
strcat(buf,":\t");
strcat(buf,msg);
strcat(buf,"\n");
for (k = 0; k < 10; k++)
{
if (chatrooms[i].user[k] != -1)
{
write(connfd[chatrooms[i].user[k]],buf,strlen(buf) + 1);
}
}
}
}
//创建聊天室
void create_chatroom(char *name,char *passwd,int sfd)
{
int i,j;
char buf[BUFFSIZE];
for (i = 0; i < MAXROOM; i++)
{
if (chatrooms[i].status == -1)
break;
}
strcpy(chatrooms[i].name,name);
strcpy(chatrooms[i].passwd,passwd);
chatrooms[i].status = 0;
for (j = 0; j < 10; j++)
{
if (chatrooms[i].user[j] == -1)
break;
}
chatrooms[i].user[j] = sfd;
strcpy(buf,"successfully created chat room.\n");
write(connfd[sfd],buf,strlen(buf) + 1);
}
//加入聊天室
void join_chatroom(char *name,char *passwd,int sfd)
{
int i,j;
int room,flag;
char buf[BUFFSIZE];
flag = -1;
for (i = 0; i < MAXROOM; i++)
{
for (j = 0; j < 10; j++)
{
if (chatrooms[i].user[j] == sfd)
{
room = i;
flag = 0;
}
}
}
if (flag == 0)
{
strcpy(buf,"you have joined the chat room ");
strcat(buf,chatrooms[room].name);
strcat(buf,".\n");
write(connfd[sfd],buf,strlen(buf) + 1);
}
else
{
for (i = 0; i < MAXROOM; i++)
{
if (chatrooms[i].status != -1)
{
if (strcmp(chatrooms[i].name,name) == 0)
{
if (strcmp(chatrooms[i].passwd,passwd) == 0)
{
for (j = 0; j < 10; j++)
{
if (chatrooms[i].user[j] == -1)
{
break;
}
}
chatrooms[i].user[j] = sfd;
strcpy(buf,"successfully joined the chat room.\n");
write(connfd[sfd], buf,strlen(buf) + 1);
return;
}
else
{
strcpy(buf,"Incorrect chat room password.\n");
write(connfd[sfd],buf,strlen(buf) + 1);
return;
}
}
}
}
}
}
//获取所有聊天群信息
void get_online_chatrooms(int sfd)
{
int i;
char buf[BUFFSIZE],nowtime[20];
time_t now;
time(&now);
struct tm *temtime = localtime(&now);
strftime(nowtime,20,"[%H:%M:%S]", temtime);
strcpy(buf,nowtime);
strcat(buf,"\t所有在线聊天室如下:\n");
for (i = 0; i < MAXROOM; i++)
{
if (chatrooms[i].status == 0)
{
strcat(buf,"\t");
strcat(buf,chatrooms[i].name);
strcat(buf,"\n");
}
}
write(connfd[sfd],buf,strlen(buf) + 1);
}
//修改密码
void change_passwd(int sfd,char *passwd)
{
int i,j;
char buf[BUFFSIZE],name[20];
for (j = 0; j < MAXMEM; j++)
{
if (sfd == online_users[j].socketfd)
{
strcpy(name,online_users[j].username);
break;
}
}
for (i = 0; i < MAXMEM; i++)
{
if (strcmp(name,users[i].username) == 0)
{
strcpy(users[i].password,passwd);
strcpy(buf,"password has been updates.\n");
write(connfd[sfd],buf,strlen(buf) + 1);
break;
}
}
}
//查询加入聊天室的用户
void get_inroom_users(int sfd)
{
int i,j;
int room,flag;
flag = -1;
char buf[BUFFSIZE],nowtime[20];
time_t now;
time(&now);
struct tm *temptime = localtime(&now);
strftime(nowtime,20,"[%H:%M:%S]",temptime);
for (i = 0; i < MAXROOM; i ++)
{
for (j = 0; j < 10; j++)
{
if (chatrooms[i].user[j] == sfd)
{
room = i;
flag = 0;
}
}
}
if (flag == -1)
{
strcpy(buf,"sorry,you have not joined the chat room.\n");
write(connfd[sfd],buf,strlen(buf) + 1);
}
else
{
strcpy(buf,nowtime);
strcat(buf,"\tall users in the ");
strcat(buf,chatrooms[room].name);
strcat(buf,":\n");
for (i = 0; i < 10; i++)
{
if (chatrooms[room].user[i] >= 0)
for (j = 0; j < MAXMEM; j++)
{
if (online_users[j].status != -1 && (chatrooms[room].user[i] == online_users[j].socketfd))
{
strcat(buf,"\t");
strcat(buf,online_users[j].username);
strcat(buf,"\n");
}
}
}
write(connfd[sfd],buf,strlen(buf) + 1);
}
}
//退出聊天室
void exit_chatroom(int sfd)
{
int i,j;
int room,flag;
flag = -1;
char buf[BUFFSIZE];
for (i = 0; i < MAXROOM; i++)
{
if (chatrooms[i].status == 0)
{
for (j = 0; j < 10; j++)
{
if (chatrooms[i].user[j] == sfd)
{
chatrooms[i].user[j] = -1;
room = i;
flag = 0;
break;
}
}
}
if (flag == 0)
break;
}
if (flag == -1)
{
strcpy(buf,"You have not joined the chat room.\n");
write(connfd[sfd],buf,strlen(buf) + 1);
}
else
{
strcpy(buf,"successfully quit chat room ");
strcat(buf,chatrooms[room].name);
strcat(buf,".\n");
write(connfd[sfd],buf,strlen(buf) + 1);
}
}
//退出服务器
void quit()
{
int i;
char msg[10];
while (1)
{
scanf("%s",msg);
if (strcmp(msg,"quit") == 0)
{
save_users();
printf("Byebye... \n");
close(listenfd);
exit(0);
}
}
}
//用户输入无效命令
void invalid_command(int sfd)
{
char buf[BUFFSIZE];
strcpy(buf, "Invalid command.\n");
write(connfd[sfd],buf,strlen(buf) + 1);
}
有看到coredump文件吗
不知道你这个问题是否已经解决, 如果还没有解决的话: 1.一个丢失的报文段意味着拥塞,因此当丢失报文段时应当降低TCP发送方的速率。对于给定的报文段,一个超时时间或四个确认(一个初始ACK和其后的三个冗余ACK)被解释为跟随该四个ACK的报文段的丢包事件的一种隐含指示。从拥塞控制的观点看,该问题是TCP发送方应当如何减小它的拥塞窗口长度,即减小其发送速率,以应对这种推测的丢包事件。
2.一个确认报文段指示该网络正在向接收方交付发送方的报文段,因此,当对先前未确认报文段的确认到达时,能够增加发送方的速率。确认的到达被认为时一切顺利的隐含指示,即报文段正从发送方成功地交付给接收方,因此该网络不拥塞。拥塞窗口长度因此能够增加。
3.带宽探测。给定ACK指示源到目的的路径无拥塞,而丢包事件指示路径拥塞,TCP调节其传输速率的策略就是增加速率以响应到达的ACK,除非出现丢包事件,此时才减小传输速率。因此,为探测拥塞开始出现的速率,TCP发送方增加它的传输速率,从该速率后退,进而再次开始探测,看看拥塞开始速率是否发生了变化。
注意网络中没有明确的拥塞状态信令,即ACK和丢包事件从当了隐式信号,并且每个TCP发送方根据异步于其他TCP发送方的本地信息而行动。
很抱歉,由于我无法看到你提供的代码和具体的环境信息,而且这个问题涉及到很多可能的原因和解决方案,因此我无法直接给出具体的解决方案。但是,我可以给你一些可能导致这些错误的常见原因和对应的解决方案:
"拒绝链接"错误:这通常表示客户端代码无法连接到服务器,常见的原因可能包括:
服务器地址或端口号错误:检查一下客户端代码中连接的服务器地址和端口号是否与服务器代码中的一致。
防火墙或其他网络安全设置导致连接被拒绝:检查一下客户端和服务器所在的网络环境是否允许连接,是否需要进行额外的网络安全设置。
"segmentation fault(core dumped)" 错误:这通常表示服务器代码在运行时发生了内存访问错误,常见的原因可能包括:
指针或数组越界访问:检查一下服务器代码中所有的指针或数组操作是否正确,是否会导致越界访问。
综上所述,要解决这些问题,你需要进一步调试代码,并检查代码中可能存在的错误和问题。如果你需要更具体的帮助,可以提供更详细的环境信息、错误日志或代码片段,这样我或其他专家可能更有可能解决你的问题。