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 *)¶m)) 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;
}
上一篇: ubuntu下面安装nodejs