距聊天室项目的完成已经过去了一年,于2018年8月1日复习一遍聊天室涉及到的知识点。
1.以下是众多头文件:
#include <stdio.h>
#include <sys/types.h> //基本系统数据类型(进程)
#include <sys/socket.h> //创建、绑定、监听、接收
#include <netinet/in.h> //socket结构体定义
#include <string.h> //字符串头文件,str簇函数
#include <stdlib.h> //
#include <unistd.h> //linux/unix的系统调用,包含了许多 U N I X系统服务的函数原型,
//例如 read,write和getpid函数。
#include <sys/wait.h> //使用wait()和waitpid()函数
#include <pthread.h> //线程的头文件
#include <arpa/inet.h> //网络地址处理方法
#include <sqlite3.h> //数据库头文件
#include <time.h>
stdlib.h 头文件即standard library标准库头文件。stdlib.h里面定义了五种类 型、一些宏和通用工具函数。 类型例如size_t、wchar_t、div_t、ldiv_t和lldiv_t; 宏例如EXIT_FAILURE、EXIT_SUCCESS、RAND_MAX和MB_CUR_MAX等等; 常用的函数如malloc()、calloc()、realloc()、free()、system()、atoi()、atol()、rand()、srand()、exit()等等。
2.套接字创建过程: //第一步:创建套接字;
socketfd = socket(AF_INET, SOCK_STREAM, 0);
if(socketfd == -1)
{
perror("socket");
return (-1);
}
printf("socket success ...\n"); //套接字创建成功
//第二步:绑定套接字
sock_server.sin_family = AF_INET; //给服务器程序绑定地址族
sock_server.sin_port = htons(MYPORT); //给服务器程序设定端口号
//sock_server.sin_addr.s_addr = inet_addr(MYADDR); //给服程序绑定固定IP地址
sock_server.sin_addr.s_addr = htonl(INADDR_ANY); //绑定任意IP地址
ret = bind(socketfd,(struct sockaddr*)&sock_server,sizeof(struct sockaddr));
if (ret == -1)
{
perror("bind");
return (-1);
}
printf("bind success...\n");
//第四步:监听套接字(客户端不需要这步)
ret = listen(socketfd,10);
//第五步:接收套接字
clientfd = accept(socketfd,(struct sockaddr*)&sock_client,&len);//服务器
ret = connect(socketfd,(struct sockaddr*)&sock_server,sizeof(struct sockaddr));//客户端
//第六步 读和发送数据
recvcnt = read(fd, &Msg, sizeof(Msg));
sendcnt = write(fd, &Msg, sizeof(struct message));
//第七步:关闭套接字
close(socketfd);
3.创建线程:ret = pthread_create(&th, NULL, read_msg, &clientfd);
//传递clientfd;要知道从那个客户端来读取数据;
//argc 首先是void类型的指针,经过(int *)argc 强制转换成int *的指针,接下来要从argc所指向
//的地址里取值
void *read_msg(void *argc);