欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-03-04 08:53:38
...

这几天刚学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;
}

相关标签: 学习笔记 socket