Programmation réseau C - client multithread

 Voici le code du client. Cet exemple utilise une connexion TCP (il nécessite trois poignées de main pour établir une connexion et quatre poignées de main pour mettre fin à une connexion ). Le client utilise principalement socket et connect pour faire une demande de connexion au client. Lors de la rédaction d'un salon de discussion, créez un fil de discussion pour recevoir des messages du serveur afin de réaliser une interaction.

La fonction qui crée un thread est

int pthread_create(pthread_t *restrict tidp,const pthread_attr_t *restrict_attr,void*(*start_rtn)(void*),void *restrict arg);

Le premier paramètre est un pointeur vers l' identifiant du thread .

Le deuxième paramètre est utilisé pour définir les propriétés du thread.

Le troisième paramètre est l'adresse de départ de la fonction du thread en cours d'exécution.

Le dernier paramètre est le paramètre permettant d'exécuter la fonction.

/*头文件*/
#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);
}

Guess you like

Origin blog.csdn.net/ls_dashang/article/details/82944830