udp 全双工通信 linux,客户端和服务器实现全双工通信(基于线程)
客户端和服务器实现全双工通信(基于线程)
1、
基于多线程实现一个服务器和一个客户端实现全双工通信
服务器端创建两个线程:一个用于接收客户端发送过来的信息;一个用来给客户端发送信息。
客户端也创建两个线程:一个用于接收服务器端发送过来的信息;一个用来给服务器端发送信息。
2、
示例代码
服务器端的代码client.c
#include
#include
#include
#include
#include
#include
#include
#include
#define SERVPORT
3333
#define BACKLOG
10 //请求队列中的最大请求数
#define MAX_CONNECTED_NO
10 //最大是128台电脑连接
#define MAXDATASIZE
100
void pthread_recv(void
*arg);
void Pthread_send(void *
arg);
int main()
{
struct sockaddr_in server_sockaddr,client_sockaddr;
int sockfd,client_fd,sin_size,ret;
pthread_t id1,id2;
sin_size =sizeof(struct sockaddr);
//struct sockaddr_in server_sockaddr,client_sockaddr;
//建立一个socket连接
//目前都是AF_INET(ipv4);SOCK_STREAM(TCP),如果是UDP,则SOCK_DGRAM
if((sockfd = socket(AF_INET,SOCK_STREAM,0))==-1){
perror("socket");
exit(1);
}
printf("socket success!,sockfd=%d\n",sockfd);
//bind用于本地IP地址和端口的绑定
server_sockaddr.sin_family=AF_INET;
server_sockaddr.sin_port=htons(SERVPORT);
server_sockaddr.sin_addr.s_addr=INADDR_ANY;
//htonl(INADDR_ANY)
bzero(&(server_sockaddr.sin_zero),8);
//把本端的信息绑定
if(bind(sockfd,(struct sockaddr
*)&server_sockaddr,sizeof(struct
sockaddr))==-1)
{
perror("bind");
exit(1);
}
printf("bind success!\n");
if(listen(sockfd,BACKLOG)==-1)
{
perror("listen");
exit(1);
}
printf("listening....\n");
//接受并保存客户端的信息
if((client_fd=accept(sockfd,(struct sockaddr
*)&client_sockaddr,&sin_size))==-1)
{
perror("accept");
exit(1);
}
printf("client_fd=%d",client_fd);
pthread_create(&id1,NULL,(void *)
pthread_recv,(void*)&client_fd);
if(ret != 0)
perror("pthread_recv creat");
ret=pthread_create(&id2,NULL,(void
*)Pthread_send,(void*)&client_fd);
if(ret != 0)
perror("Pthread_send creat");
pthread_join(id1,NULL);
pthread_join(id2,NULL);
close(sockfd);
}
//服务器发送线程
void Pthread_send(void *
arg)
{
int buf_len, client_fd,sendbytes;
char buf[MAXDATASIZE];
client_fd = *((int *)arg);
printf("server send: ");
while(1)
{
fgets(buf,MAXDATASIZE,stdin);
buf_len =sizeof(buf);
if((sendbytes = send(client_fd ,buf,buf_len,0))==-1)
{
perror("send");
exit(1);
}
if(!strncmp(buf,"end",3)) //只比较字符串的前三个字符
break;
sleep(2);
}
}
//服务器接收数据线程
void pthread_recv(void
*arg)
{
int buf_len, client_fd,recvbytes;
char buf[MAXDATASIZE];
client_fd = *((int *)arg);
//接收服务端发来的信息
while(1)
{
if((recvbytes = recv(client_fd ,buf,MAXDATASIZE,0))==-1)
{
perror("recv");
exit(1);
}
else
{
buf[recvbytes]=0;
printf("server received data from server is
:%s\n",buf);
if(!strncmp(buf,"end",3)) //只比较字符串前三个字符
break;
}
sleep(1);
}
}
客户端的代码:
#include
#include
#include
#include
#include
#include
#include
#include
#define SERVPORT
3333
#define MAXDATASIZE
100
void pthread_recv(void
*arg);
void Pthread_send(void *
arg);
main(int argc,char
*argv[]){
int sockfd,sin_size,ret;
struct hostent *host;
pthread_t id1,id2;
struct sockaddr_in
serv_addr; //套接字的地址结构
struct sockaddr_in server_sockaddr;
if(argc < 2)
{
fprintf(stderr,"Please enter the server's hostname!\n");
exit(1);
}
//AF_INET:使用的是IPV4
//SOCK_STREAM:流式套接字
if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
{
perror("socket");
exit(1);
}
printf("sockfd=%d\n",sockfd);
serv_addr.sin_family=AF_INET;
serv_addr.sin_port=htons(SERVPORT);
//serv_addr.sin_addr=*((struct
in_addr *)host->h_addr);
//host->h_addr强制类型转换;建议直接使用下面的方法
serv_addr.sin_addr.s_addr=inet_addr(argv[1]); //"127.0.0.1"); Internet地址
bzero(&(serv_addr.sin_zero),8);
//连接
if(connect(sockfd,(struct sockaddr
*)&serv_addr,sizeof(struct
sockaddr))==-1)
{
perror("connect");
exit(1);
}
ret=pthread_create(&id1,NULL,(void
*)Pthread_send,(void*)&sockfd);
if(ret != 0)
perror("Pthread_send creat");
pthread_create(&id2,NULL,(void *)
pthread_recv,(void*)&sockfd);
if(ret != 0)
perror("pthread_recv creat");
pthread_join(id1,NULL);
pthread_join(id2,NULL);
close(sockfd);
}
//客户端发送数据线程
void Pthread_send(void *
arg)
{
int buf_len, sockfd,sendbytes;
char buf[MAXDATASIZE];
sockfd = *((int *)arg);
printf("client send: ");
while(1)
{
fgets(buf,MAXDATASIZE,stdin);
buf_len =sizeof(buf);
if((sendbytes = send(sockfd,buf,buf_len,0))==-1)
{
perror("send");
exit(1);
}
if(!strncmp(buf,"end",3)) //只比较字符串的前三个字符
break;
sleep(2);
}
}
//客户端接收数据线程
void pthread_recv(void
*arg)
{
int buf_len, sockfd,recvbytes;
char buf[MAXDATASIZE];
sockfd = *((int *)arg);
//接收服务端发来的信息
while(1)
{
if((recvbytes = recv(sockfd,buf,MAXDATASIZE,0))==-1)
{
perror("recv");
exit(1);
}
else
{
buf[recvbytes]=0;
printf("client received data from server is :%s\n",buf);
if(!strncmp(buf,"end",3)) //只比较字符串的前三个字符
break;
}
sleep(1);
}
}
2012年4月22日星期日
udp 全双工通信 linux,客户端和服务器实现全双工通信(基于线程)相关推荐
- 客户端和服务器之间的信息结构,客户端与服务器之间的通信过程
客户端与服务器之间的通信过程 内容精选 换一换 一.HTTP概念超文本传输协议(HTTP,HyperTextTransferProtocol)是互联网上应用最为广泛的一种网络协议.所有的WWW文件都必 ...
- 客户端与服务器之间的通信过程
客户端与服务器之间的通信过程主要分为三步:请求--处理--响应 1.客户端发起请求 2.服务器处理本次请求 3.服务器响应客户端
- java iso8583 socket 服务_JAVA客户端amp;服务器的socket通信
JAVA客户端&服务器的socket通信 socket是两台主机之间的一个连接通道,它可以完成七个基本操作: 发送远程机器 发送数据 接收数据 关闭连接 绑定端口 监听入站数据 再绑定端口上接 ...
- VB6 通过winsock控件数组实现客户端和服务器多对一通信
说明:我是在最近开发一个考试系统过程中搜索到上面文章的,它提供的思想非常实用.当然,这篇文章仅提供了一个基本思路,详细的实现在人民邮电出版社出版的<Visual Basic网络通信协议分析与应用 ...
- 想破解游戏协议?你知道客户端和服务器是怎么通信的?我来告诉你怎么定义的
目录 1.Java项目引用 2.protobuf 的文件定义格式 基础类型 特殊字段 3.生成java类 4.使用协议 5.如何在游戏项目中使用 游戏服务器和客户端的通信有很多种形式,有的用http, ...
- 客户端和服务器实现全双工通信(基于线程)
http://blog.sina.com.cn/s/blog_87766e4a0100yp7a.html 1. 基于多线程实现一个服务器和一个客户端实现全双工通信 服务器端创建两个线程:一个用于接收客 ...
- Android客户端与服务器之间的通信
本文将介绍Android客户端与服务器端的通信的简单实现方法. 要两点需要注意的地方: 1.Android 端记得在AndroidManifest.xml里记得获取一下网络权限,否则无法进行网络通信, ...
- linux搭建web服务器论文答辩开场白,基于ARM9嵌入式Linux系统Web Server服务器计算机设计与科学专业毕业答辩.ppt...
基于ARM9嵌入式Linux系统Web Server服务器计算机设计与科学专业毕业答辩 2009-5-31 计算机科学与技术专业 2009届本科生毕业论文答辩 基于ARM9的嵌入式Linux系统的We ...
- android客户端与服务器交互数据(基于SAOP协议的远程调用标准,通过webservice可以将不同操作系统平台,不同语言,不同技术整合)
在PC机器java客户端中,需要一些库,比如XFire,Axis2,CXF等等来支持访问WebService,但是这些库并不适合我们资源有限的android手机客户端,做过JAVA ME的人都知道有K ...
最新文章
- 网站预加载进度条的实现
- 我们离通用智能机器人大脑还有多远?看看这家科技公司给出的答案
- 您的凭依不工作/登录没有成功
- [LeetCode-JAVA] The Skyline Problem
- JVM 方法调用之动态分派
- 学术壁报模板_中华医学会核医学分会2020年学术年会征文通知
- SQL 2016——新功能
- 2020 年全球移动 APT事件总结
- Apple Pencil有必要买正版吗?Apple Pencil平替推荐
- Python Opencv 简单视频裁剪功能的实现
- 微信公众号调取相册和摄像头功能,实现图片上传
- 论混合软件架构的设计
- c语言用循环函数求平方,用C语言程序三种循环语句分别编写程序,求1-100的平方值?...
- 中石油 : 炸弹安放
- 基于Nginx实现访问控制,连接限制离
- jQuery中的使用end()方法
- 嵌入式编程相关专业英语积累
- 高中数学公式总结:解析几何(非常全)
- Android 的动作、广播、类别等标识大全
- 人性的劣根 — 如何战胜另一个你
热门文章
- Linux磁盘列阵分区
- Qt模仿QQ聊天窗口(四)
- HTTP 访问返回数字代码含义
- [记录] C++搭建酷Q机器人开发环境
- 【Linux】【踩坑专栏】centOS 7 桌面版使用VMWare Workstation Player 16安装时踩坑
- Linux增加swap虚拟内存
- 大物热力学基础笔记_1
- 时钟切换电路(clock switching glitch free)英文版
- 游戏:Flappy Bird[飞行的鸟](C++)2.0
- 摹客rp-产品原型设计(毫无经验)