下面是客户端的代码,本例用的是TCP连接(建立一个连接需要三次握手,而终止一个连接要经过四次握手),客户端主要用的是socket和connect,向客户端提出连接请求,在写聊天室的时候,创建线程接收服务器的消息实现交互
创建线程的函数是
int pthread_create(pthread_t *restrict tidp,const pthread_attr_t *restrict_attr,void*(*start_rtn)(void*),void *restrict arg);
第二个参数用来设置线程属性。
第三个参数是线程运行函数的起始地址。
最后一个参数是运行函数的参数。
/*头文件*/
#include <stdio.h> //标准输入输出函数
#include <netdb.h> //gethostbyname()得到主机名字和地址信息的指针
#include <sys/socket.h> //套接口相关函数
#include <arpa/inet.h> //inet_addr()将字符串转化为二进制网络字节序IPV4地址
#include <stdlib.h> //exit()
#include <string.h> //bzero(),strcmp()
#include <pthread.h> //线程
#include <unistd.h>
void *thr_fn(void *arg)
{
printf("client new thread: ");
return ((void *) 0);
}
int main(int argc, char **argv)
{
struct sockaddr_in server_addr; //定义服务器结构体
pthread_t id; //线程id
int ret; //创建线程返回值
int sockfd;
//确认输入正确的ip地址
if(argc != 2)
{
printf("请输入客户端ip地址(127.0.0.1):\n");
exit(-1);
}
if(gethostbyname(argv[1]) == NULL)
{
printf("无法识别您输入的ip地址!\n");
exit(-1);
}
//创建端口
if((sockfd = socket(AF_INET,SOCK_STREAM,0)) == -1)
{
perror("socket");
printf("端口创建失败!\n");
exit(-1);
}
//端口相关地址初始化
bzero(&server_addr,sizeof(server_addr)); //置字节字符串s的前n个字节为零
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = inet_addr(argv[1]); //inet_addr("192.168.181.128");
server_addr.sin_port = htons(8769); //端口号8769
//连接服务器
if(connect(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr)) == -1)
{
perror("connect");
printf("连接服务器失败!\n");
exit(-1);
}
//创建分线程接收服务器消息
ret = pthread_create(&id,NULL,thr_fn,NULL);
if(ret != 0)
{
perror("pthread_create");
printf("线程创建失败!\n");
}
printf("线程id = %d\n",ret);
printf("sockfd = %d\n",sockfd);
//关闭连接
close(sockfd);
exit(0);
}