服务器端如何区分UDP,TCP 给客户端返回数据?

C语言 码拜 10年前 (2015-05-11) 1654次浏览 0个评论
 

ARM上用LINUX ,查了说了EPOLL效率不错,于是用了EPOLL,TCP,UDP都是EPOLL

 
这是TCP \UDP接到PC发来指令后,共同调用的函数,(原来这里封装有出口,也就说,大家都调用这个函数后,返回值都通过这个函数把处理结果,通过参数返回来)

现在,同事,不想通过这个函数把结果返回,而是直接在各个命令处理分支,处理完成后,直接调用TCP/UDP的发送,把结果直接送给PC。。。

那么遇到问题,到各个分支里,如何确定是用UDP 还是TCP 把结果送出去呢?

后面可能还有RS232/RS485,都调用这个处理函数…

处理函数:

void Receive_Process(int conn_fd,unsigned char* buff_r)

服务器TCP方式,接到PC命令后,调用函数,是回调方式的:

//处理PC来的命令包// 
if(ProcessCallback)
{
	ProcessCallback(events[n].data.fd, send_data_buffer_size_tcp);
}

TCP方式在回调函数里,发送结果:

send(conn_fd, buff_w, 5, 0);

UDP方式,接受命令后,调用处理函数:

	Receive_Process(ret,recvbuf);

UDP 发送数据给PC:
UDP时,FD句柄是个全局变量;TCP时,是通过回调把FD句柄传下去


void udp_send_to_pc(int len,char* buffer)
{
	sendto(new_fd, buffer, len, 0, (struct sockaddr *)&client_addr, cli_len);
	}
5分
getsockopt SO_TYPE 可以获取socket类型,比如SOCK_RAW,SOCK_STREAM,SOCK_DGRAM等等。
5分
1L +1,  
什么时候用TCP,什么时候用UDP这个应该是设计的时候就规定好了吧, 不然为什么要搞两种协议。
如果没有规定,那么这个设计好凌乱
10分
“直接在各个命令处理分支,处理完成后,直接调用TCP/UDP的发送,把结果直接送给PC。。。”
如果是多线程处理的话,楼主和你的同事们就准备受死吧。
引用 3 楼 zhao4zhong1 的回复:

“直接在各个命令处理分支,处理完成后,直接调用TCP/UDP的发送,把结果直接送给PC。。。”
如果是多线程处理的话,楼主和你的同事们就准备受死吧。

我是不想死的,我坚持过我的意见,不建议这么干的,但是,同事年纪大,资格老,老大信他多一点,
既然这样,我就妥协了,任何事情总得有人的先妥协,哪怕以后发现我的建议是对的…

所以现在,我选了一个比较折中的办法,让老大拉人进项目中,整个项目我还负责其他部分的工作,借口工作内容多,没精力…
不要到最后,被你一语成谶了,,我成替罪羊了,所有问题都成了我的问题。。。

20分
区分 udp 与 tcp  的 fd .
1).  1楼
2).  记录  udp  的 fd, 接收/发送数据时判断处理…
3).  用 read() / write() 函数 操作 fd ,  udp/tcp 通吃
20分
服务器设计的时候就订好采用何种协议了吧!目前绝大多数都是TCP,用UDP的不多了吧!过程非常像,socket和connect的参数好像有区别
如果同时存在,可以检测报文的协议字段进行区分。但是话又说回来了,同时存在应该是两个服务器进程,不可能是同一个服务器进程服务两种协议吧?!
引用 6 楼 my_live_123 的回复:

服务器设计的时候就订好采用何种协议了吧!目前绝大多数都是TCP,用UDP的不多了吧!过程非常像,socket和connect的参数好像有区别
如果同时存在,可以检测报文的协议字段进行区分。但是话又说回来了,同时存在应该是两个服务器进程,不可能是同一个服务器进程服务两种协议吧?!

我们所谓的服务器,其实就是基于ARM跑linux的设备,当作一个服务器。

设备要与PC等控制端交互….

10分
引用 7 楼 wanyeye 的回复:
Quote: 引用 6 楼 my_live_123 的回复:

服务器设计的时候就订好采用何种协议了吧!目前绝大多数都是TCP,用UDP的不多了吧!过程非常像,socket和connect的参数好像有区别
如果同时存在,可以检测报文的协议字段进行区分。但是话又说回来了,同时存在应该是两个服务器进程,不可能是同一个服务器进程服务两种协议吧?!

我们所谓的服务器,其实就是基于ARM跑linux的设备,当作一个服务器。

设备要与PC等控制端交互….

那应该属于驱动开发的范畴

30分
引用 3 楼 zhao4zhong1 的回复:

“直接在各个命令处理分支,处理完成后,直接调用TCP/UDP的发送,把结果直接送给PC。。。”
如果是多线程处理的话,楼主和你的同事们就准备受死吧。

告诉你可能的一种死法:
线程1发送“ABCD”
线程2发送”abcd”
接收方收到“AaBCbcDd”


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明服务器端如何区分UDP,TCP 给客户端返回数据?
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!