linux下socket的TCP服务端和客户端双向通信程序笔记

这几天刚学TCP网络通信,根据单向通信的例程利用线程修改成了双向通信的程序,程序还是很粗糙,记录下来以便日后修改,一个服务端程序名叫fuwu.c 客户端程序名叫kehu.c。

使用时在终端输入下面指令

第一步:在终端输入gcc fuwu.c -o fuwu -lpthread
第二步:在终端输入gcc kehu.c -o kehu -lpthread
第三步:再打开一个终端一个终端输入./fuwu  然后另一个终端输入./kehu

然后就可以互相发送数据了,任意一端输入“quit”并按回车即可退出程序
服务端 :

#include <sys/types.h>	
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<unistd.h>
#include<stdio.h>
#include<errno.h>
#include<string.h>
#include<pthread.h>
#include<stdlib.h>
#include<unistd.h>
#define EHCO_PORT 8080
#define MAX_CLIENT_NUM 10
char buff[101];
int clientfd;
char a[100];
int n;
int kk=0;
struct text		//线程参数用到的结构体
{
int clientfd1;	
int n1;
};

void* fun()		//线程用到的函数
{	
	
	while(1)
	{
	scanf("%s",a);
	printf("send = %s\n",a);
	send(clientfd,a,n,0);
	if(0==strncmp(a,"quit",4)) {kk=1;break;}
	}
}

void* fun1()		//线程用到的函数
{
		while(1)
		{	
			n = recv(clientfd,buff,100,0);
			buff[n] = '\0';
			printf("date = %s\n",buff);
			fflush(stdout);	
			if(strncmp(buff,"quit",4)==0) {kk=1;break;}
		}
}
int main()
{   
	struct text param;
	int sock_fd;
	pthread_t tid,tid1;
	struct sockaddr_in serv_addr;
	
	struct sockaddr_in clientAdd;

	socklen_t len;
	
	/*创建socket*/
	sock_fd = socket(AF_INET,SOCK_STREAM,0);
	if(sock_fd == -1)
	{
		perror("create socket error\n");
		return 0;
	}
	else {printf("success to create socket %d\n",sock_fd);}
	/*设置server地址结构*/
	bzero(&serv_addr,sizeof(serv_addr));
	serv_addr.sin_family = AF_INET;
	serv_addr.sin_port = htons(EHCO_PORT);
	serv_addr.sin_addr.s_addr = htons(INADDR_ANY);		//取主机的ip地址,也可以用inet_addr("192.168.1.157")手动设置
	bzero(&(serv_addr.sin_zero),8);
	/*把地址和套接字绑定*/
	if(bind(sock_fd,(struct sockaddr*)&serv_addr,sizeof(serv_addr)) !=0)
	{
		printf("bind address fail %d\n",errno);
		close(sock_fd);
		return 0;
	}
	else{printf("success to bind address!\n");}
	/*设置套接字监听*/
	if(listen(sock_fd,MAX_CLIENT_NUM)!=0)
	{
		perror("listen error!\n");
		close(sock_fd);
		return 0;
	}
	else{printf("success to listen!\n");}
	/*创建新连接对应的套接字*/
	len = sizeof(clientAdd);
	clientfd = accept(sock_fd,(struct sockaddr*)&clientAdd,&len);
	if(clientfd<=0)
	{
		perror("accept error!\n");
		close(sock_fd);
		return 0;
	}
	/*接受用户发来的数据*/
	
	if(pthread_create(&tid1,NULL,&fun1,NULL)) perror("thread fail\n");
	if(pthread_create(&tid,NULL,&fun,NULL)) perror("thread fail\n");
	while(1)
	{
	if(kk==1)
		{						
		pthread_cancel(tid);		//取消线程,关闭socket,退出程序
		close(clientfd);
		close(sock_fd);
		break;
		}
	}
	return 0;
}

客户端:

#include <sys/types.h>	
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<unistd.h>
#include<stdio.h>
#include<errno.h>
#include<string.h>
#include<pthread.h>
#include<stdlib.h>
#include<unistd.h>

#define EHCO_PORT 8080
#define MAX_COMMAND 5
char a[100];
int sock_fd,n;
char tmp_buf[100];
int kk=0;
struct text		//线程参数用到的结构体
{
int clientfd1;	
int n1;
};
void *fun(void *arg)
{	
	struct text *arg1 = (struct text *)arg;
	while(1)
	{		
	scanf("%s",a);
	printf("send = %s\n",a);
	send(arg1->clientfd1,a,arg1->n1,0);
	if(0==strncmp(a,"quit",4)) {kk=1;break;}
	}
}

void *fun1()
{
	while(1){
	
	n = recv(sock_fd,tmp_buf,100,0);
	tmp_buf[n]='\0';
	printf("date = %s\n",tmp_buf);
	fflush(stdout);	
	if(0==strncmp(tmp_buf,"quit",4)) {kk=1;break;}
	}
	
}

int main()
{
	struct text param;

	pthread_t tid,tid1;
	struct sockaddr_in serv_addr;
	int i;
	/*创建socket*/
	sock_fd = socket(AF_INET,SOCK_STREAM,0);
	if(sock_fd==-1)
	{
		perror("creat socket error!\n");
		return 0;
	}
	else{printf("success to creat socket %d\n",sock_fd);}
	/*设置server结构地址*/
	bzero(&serv_addr,sizeof(serv_addr));
	serv_addr.sin_family = AF_INET;
	serv_addr.sin_port = htons(EHCO_PORT);
	serv_addr.sin_addr.s_addr = htons(INADDR_ANY);
	bzero(&(serv_addr.sin_zero),8);
	/*连接到服务端*/
	if(-1==connect(sock_fd,(struct sockaddr*)&serv_addr,sizeof(serv_addr)))
	{
		perror("connect error!\n");
		close(sock_fd);
		return 0;
	}
	printf("success connect to server!\n");
	/*发送并接受返回的数据*/
	param.clientfd1=sock_fd;
	param.n1 = 100;
	if(pthread_create(&tid,NULL,&fun,(void *)&param)) perror("thread fail\n");
	if(pthread_create(&tid1,NULL,&fun1,NULL)) perror("thread fail\n");
	else{printf("pthread success\n");}
	//close(sock_fd);
	while(1)
	{
		if(kk==1)
		{
		pthread_cancel(tid);
		close(sock_fd);	
		break;		
		}
	}
	return 0;
}

  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值