服务端:
//线程
//线程
void *net_thread(void * fd)
{
recv_package recv;
pthread_detach(pthread_self());
int new_fd=*((int *)fd);
while(1)
{
//读取recv.seg的值
if(-1 == read(new_fd,&recv,sizeof(recv)))
{
perror("read3");
exit(9);
}
switch(recv.seg)
{
case 1:
login_1(new_fd);
break; //登录
case 2:
regist_1(new_fd); //注册
break;
case 3:
drop_out_1(new_fd);
printf("用户已退出\n");
return 0;
}
}
//close(new_fd); //关闭连接socket描述符
}
//主函数
int main(void)
{
printf("☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★\n");
printf("★ ☆\n");
printf("☆ 1:首次登录 ★\n");
printf("★ 2:非首次登录 ☆\n");
printf("☆ ★\n");
printf("★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆ ★ ☆\n");
int sel;
printf(" ○ 请确认您的选择:\n");
scanf("%d",&sel);
switch(sel)
{
case 1:
create_db();
break;
case 2:
printf("表已建立成功\n");
break;
}
//新建套接字
int sockfd = socket(AF_INET,SOCK_STREAM,0);
if( -1 == sockfd)
{
perror("socket");
exit(1);
}
//套接字建立好之后,将主机IP和端口号等地址信息与套接字绑定
struct sockaddr_in server_addr; //定义一个常用地址结构变量
server_addr.sin_family = AF_INET; //将地址族确定为ipv4
server_addr.sin_port = htons(portnum); //字节序的短整型转换
server_addr.sin_addr.s_addr = htonl(INADDR_ANY); //IP地址号
//进行连接,设置最大连接数
if( -1 == bind(sockfd,(struct sockaddr*)&server_addr,sizeof(struct sockaddr_in)))
{
perror("bind");
exit(2);
}
//进行监听
if(-1 == listen(sockfd,5))
{
perror("listen");
exit(3);
}
while(1)
{
//等待客户端连接,未连接是accept阻塞
struct sockaddr_in client_addr;
//客户端地址信息大小,accept()传入size的地址
int size = sizeof(struct sockaddr_in);
int new_fd = 0;
new_fd = accept(sockfd,(struct sockaddr *)&client_addr,&size);
if(-1 == new_fd)
{
perror("accept");
exit(4);
}
printf("accept IP :%s\n",inet_ntoa(client_addr.sin_addr));
printf("accept portnum:%d\n",client_addr.sin_port);
int ret;
int pthread_id;
pthread_create((pthread_t *)&pthread_id,NULL,net_thread,(void *)&new_fd);
if(-1 == ret)
{
perror("pthread_create");
close(new_fd);
continue;
}
}
/* 关闭套接字文件描述符 */
close(sockfd);
return 0;
}
客户端
int main(void)
{
//输入主机名或者IP地址
printf("please input hostname:\n");
//获得主机名对应的IP信息
char name[40];
scanf("%s",name);
struct hostent *h = gethostbyname(name);
if(NULL == h)
{
perror("gethostbyname");
exit(1);
}
//新建socket
int sockfd = socket(AF_INET,SOCK_STREAM,0);
if(-1 == sockfd)
{
perror("socket");
exit(2);
}
//设置服务器绑定的IP地址和端口等属性
struct sockaddr_in server_addr;
server_addr.sin_family = AF_INET; //选择ipv4
server_addr.sin_port = htons(portnum); //端口号
server_addr.sin_addr = *((struct in_addr *)h->h_addr);//注意格式转换*((struct in_addr *)h->h_addr_list[0])
if(-1 == connect(sockfd,(struct sockaddr *)&server_addr,sizeof(struct sockaddr_in)))
{
perror("connect");//对服务器进行连接
exit(3);
}
printf("The connection was successful! \n");//连接成功
//执行函数
menu(sockfd);
// close(sockfd);
return 0;
}
运行结果:
4和-1是我打印服务端new_fd的值,为什么第二次为-1,appect直接进入非阻塞状态,这是为什么?
有没有大佬帮我解惑!