C网络编程--多线程客户端

 下面是客户端的代码,本例用的是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);
}

猜你喜欢

转载自blog.csdn.net/ls_dashang/article/details/82944830
今日推荐