socket.c

#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <string.h>
#include <pthread.h>
#include “…/address/address.h”
#include <sqlite3.h>
#include <unistd.h>

int fd[1024]={0};
pthread_t tid;

void add_info(Chat * c);
void del_info(Chat * c);
void update_info(Chat * fd);
void search_info(Chat c,int fd);
void exit_client(int fd);
void show_info(int fd);

int InitNet()
{
struct sockaddr_in server_addr;
int sockfd=socket(PF_INET, SOCK_STREAM,0);
if(-1==sockfd)
{
perror(“socket”);
}
int opt=1;
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = PF_INET;
server_addr.sin_port = htons(8888);
server_addr.sin_addr.s_addr = inet_addr(“127.0.0.1”);
int ret = bind(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr));
if(-1 == ret)
{
perror(“bind”);
exit(1);
}
ret = listen(sockfd, 10);
if(-1 == ret)
{
perror(“listen”);
exit(1);
}
return sockfd;
}

void exit_client(int fd)
{
printf(“客户端%d下线\n”,fd);
close(fd);//关闭TCP连接
pthread_exit((void*)0);//线程退出

}

void *client_handler(void *arg)//线程函数
{
Chat c;
int fd = (int)arg;
while(1)
{
int ret = recv(fd, &c, sizeof©, 0);
if(-1 == ret)
{
perror(“recv”);
}
switch(c.cmd)
{
case ADDINFO:
add_info(&c);
break;
case DELINFO:
del_info(&c);
break;
case UPDATEINFO:
update_info(&c);
break;
case SEARCHINFO:
search_info(c,fd);
break;
case SHOWINFO:
show_info(fd);
break;
case EXIT:
exit_client(fd);
break;
}
}
}

void main_handler(int sockfd)
{
struct sockaddr_in client_addr;//保存客户端信息
int i = 0;
int length = sizeof(client_addr);
while(1)
{
for(i=0;i<1024;i++)
{
if(0 == fd[i])
{
break;
}
}
fd[i] = accept(sockfd, (struct sockaddr*)&client_addr, &length);//接受客户端连接
printf(“接受客户端连接%d\n”, fd[i]);
int ret = pthread_create(&tid, NULL, client_handler, &fd[i]);//一个客户端一个线程
if(-1 == ret)
{
perror(“pthread_create”);
exit(1);
}
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值