您的位置:首页 > 运维架构 > Linux

Linux聊天室 搭建服务器

2017-02-10 19:10 381 查看

      最近自己在写c语言中的聊天室项目,简单点说即利用网络编程让不同终端的用户进行聊天等,要想做出好的聊天室项目出来,基础最重要也就是说要搭建好服务器和客户端的架构,服务器端:

 (1)创建监听套接字:

listen_sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (listen_sockfd == -1)
{
perror("create socket error");
return -1;
}
(2)初始化服务器地址结构:

bzero(&server_addr, sizeof(server_addr));          // 将地址结构变量清零
server_addr.sin_family = AF_INET;                  // 选择IPV4地址
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);   // 监听本地任意IP地址
server_addr.sin_port = htons(SERV_PORT);           // 将本地端口号转化为网络端口号
(3)绑定本地地址和端口号:

ret = bind(listen_sockfd, (struct sockaddr *)&server_addr, sizeof (server_addr));
if (ret == -1)
{
perror ("bind error");
return -1;
}
(4)监听套接字:

ret = listen(listen_sockfd, 20);
if (ret == -1)
{
perror("listen error");
return -1;
}


(5)接下来就是让服务器接收客户端的连接请求,为了使服务器能一直保持运行状态这里便用了一个while(1)循环,同时每连接进来一个服务器便给它创建一个线程专门去处理客户端的请求:

while(1)
{

client_len = sizeof(client_addr);

clientfd = accept(listen_sockfd, (struct sockaddr *)&client_addr, &client_len);
if (clientfd == -1)
{
perror("accept error");
return -1;
}
else
{
printf("连接成功\n");
}

// 创建线程处理客户端请求

ret = pthread_create(&tid, NULL, (void *)server_request, (void *)clientfd);
if (ret != 0)
{
printf ("create pthread error!\n");
return -1;
}

}
然后将客户端的结构搭建起来,客户端主要是发送和接受两个大的功能,一开始自己在主线程中直接创建了两个线程,分别用来读和写,但后来发现这样做两个线程的读写之间会发生不该有的一系列错误,而且还浪费了主线程这条主线路,便只在主函数中创建了一个读线程只用来接受服务器的传过来的信息,主线程则用来面向客户输入指令给服务器,下面则是客户端基本架构的代码:

int main(int argc , char *argv[])
{

struct sockaddr_in client_addr;  // 服务器地址结构
int server_sockfd ;
int ret ;
pthread_t pid1;//创建线程的ID
pthread_t pid2;

if(argc != 2)
{
printf("对不起 您的输入有误 记得输入服务器的地址哦\n") ;
return -1 ;
}

//创建监听套接字
server_sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (server_sockfd == -1)
{
perror("创建 socket 失败");
return -1;
}

// 初始化服务器地址结构
bzero(&client_addr, sizeof(client_addr));     // 将地址结构变量清零
client_addr.sin_family = AF_INET;             // 选择IPV4地址
inet_aton(argv[1], &client_addr.sin_addr);    // 填写服务器地址
client_addr.sin_port = htons(SERV_PORT);      // 填写服务器端口

// 连接服务器
ret = connect(server_sockfd, (struct sockaddr *)&client_addr,  sizeof (client_addr));

if (ret != 0)
{
perror("connect error");
return -1;
}
// 创建接受消息线程
ret = pthread_create(&pid1, NULL, (void *)read_from_server, (void *)server_sockfd);
if (ret != 0)
{
printf ("对不起  创建线程失败!\n");
return -1;
}

//主线程专门写消息

write_to_server(server_sockfd) ;
//关闭连接
close(server_sockfd);

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: