tcp_pthread的搭建(个人学习记录)

本文详细介绍了使用C语言通过socket编程创建一个简单的TCP服务器和客户端,包括socket初始化、地址复用、bind、listen、accept和read操作,以及server.c和client.c程序的实现和编译结果。

目录

一.搭建

1.socket

1.1快速地址复用

2.bind

3.listen

4.accept

5.read

二.程序

1.sever.c

2.client.c

3.编译结果


一.搭建

1.socket

	int fd;
	fd = socket(AF_INET, SOCK_STREAM, 0);
	if(fd < 0)
	{
		perror("socket");
		return -1;
	}

1.1快速地址复用

	int optval = 1;
	setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(int));

2.bind

	struct sockaddr_in addr;
	bzero(&addr, sizeof(addr));
	addr.sin_family = AF_INET;
	addr.sin_port = htons(port);
#if 0
	addr.sin_addr.s_addr = inet_addr(ip);
#else
	ret = inet_pton(AF_INET, ip, (void *)&addr.sin_addr);
	if(ret != 1)
	{
		perror("inet_pton");
		return -1;
	}
#endif

	ret = bind(fd, (struct sockaddr *)&addr, sizeof(addr));
	if(ret < 0)
	{
		perror("bind");
		return -1;
	}

3.listen

	ret = listen(fd, 5);
	if(ret < 0)
	{
		perror("listen");
		return -1;
	}

4.accept

if((acceptfd = accept(fd, (struct sockaddr *)&addr_s, &add_lenth)) < 0 )
{
	perror("accept");
	break;
}

5.read

while(1)
{
	bzero (buf, sizeof(buf));
	do{
		ret = read(acceptfd , buf, 1024);
	}while(ret < 0);
		if(ret < 0)
		{
			perror("read");
			return -1;
		}
			if(!ret)
			{
				break;
			}
				printf("client %d,rcv>>> %s",acceptfd,buf);
				if (!strncasecmp (buf, "quit", 4)) {	//用户输入了quit字符
				printf ("Client(fd=%d) is exiting!\n", acceptfd);
				break;	
		        }
}

二.程序

1.sever.c

#include <stdio.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <string.h>
#include <stdint.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>
#include <pthread.h>



#define port 5001
#define ip "192.168.43.100"


void *handle(void *arg)
{
	int ret;
	char buf[1024];
	int acceptfd = *(int *)arg;
	pthread_detach(pthread_self());
	while(1)
	{
		do{
			ret = read(acceptfd, buf, 1024);
		}while(ret < 0);
		if(ret < 0)
		{
			perror("read");
			return NULL;
		}
		if(!ret)
		{
			break;
		}
		printf("<fd:%d> client rcv>>> %s",acceptfd,buf);	
	}
	close(acceptfd);
	pthread_exit(NULL);
}
int main(int argc,char *argv[])
{
	/*
	   if(argc != 3)
	   {
	   printf("%s <port> <ip>\n", __FILE__);
	   return -1;
	   }
	   if(port < 5000)
	   {
	   printf("port > 5000\n");
	   return -1;
	   }
	   */
	//   printf("port = %s, ip = %s\n",port,ip);

	int fd,acceptfd;
	int ret;
	fd = socket(AF_INET, SOCK_STREAM, 0);
	if(fd < 0)
	{
		perror("socket");
		return -1;
	}

	int optval = 1;
	setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(int));

	struct sockaddr_in addr;
	bzero(&addr, sizeof(addr));
	addr.sin_family = AF_INET;
	addr.sin_port = htons(port);
#if 0
	addr.sin_addr.s_addr = inet_addr(ip);
#else
	ret = inet_pton(AF_INET, ip, (void *)&addr.sin_addr);
	if(ret != 1)
	{
		perror("inet_pton");
		return -1;
	}
#endif
	ret = bind(fd, (struct sockaddr *)&addr, sizeof(addr));
	if(ret < 0)
	{
		perror("bind");
		return -1;
	}
	ret = listen(fd, 5);
	if(ret < 0)
	{
		perror("listen");
		return -1;
	}

	char ch[16];

	struct sockaddr_in addr_s;
	socklen_t  add_lenth = sizeof(struct sockaddr_in);
	printf("sever start >>>>\n");

	while(1)
	{
		acceptfd = accept(fd, (struct sockaddr *)&addr_s, &add_lenth);
		printf("<fd:%d> client:(%d:%s)\n",acceptfd,ntohs(addr_s.sin_port), inet_ntop(AF_INET,(void *)&addr_s.sin_addr, ch, 16));
		pthread_t tid;
		pthread_create(&tid, NULL, handle, (void *)&acceptfd);
	}
	close(fd);
}

2.client.c

#include <stdio.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <string.h>
#include <stdint.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdlib.h>

#define port atoi(argv[1])
#define ip argv[2]

int main(int argc,char *argv[])
{
	if(argc != 3)
	{
		printf("%s <port> <ip>\n", __FILE__);
		return -1;
	}
	if(port < 5000)
	{
		printf("port > 5000\n");
		return -1;
	}
	//   printf("port = %s, ip = %s\n",port,ip);

	int fd;
	int ret;
	fd = socket(AF_INET, SOCK_STREAM, 0);
	if(fd < 0)
	{
		perror("socket");
		return -1;
	}
	struct sockaddr_in addr;
	bzero(&addr, sizeof(addr));
	addr.sin_family = AF_INET;
	addr.sin_port = htons(port);
	addr.sin_addr.s_addr = inet_addr(ip);
	ret = connect(fd, (struct sockaddr *)&addr, sizeof(addr));
	if(ret < 0)
	{
		perror("connect");
		return -1;
	}
	printf("client start >>>>\n");
	char buf[1024];
	while(1)
	{
		bzero(buf, sizeof(buf));
		printf(">");
		fgets(buf, 1024, stdin);
		write(fd, buf, sizeof(buf));
		if((strncmp(buf, "quit", 4)) == 0)
		{
			printf("client quit\n");
			close(fd);
			exit(1);
		}
	}
	close(fd);
}

3.编译结果

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值