"); //-->
在这上面花了一周多,先是思路上的致命错误,导致浪费较多时间,不过调整下很快的完成了自己所需要的代码。
期间碰到的几个比较大的问题自己做下记录:
1、bind函数的理解错误,这个一般是在服务端用来绑定端口,而我一直以为可以用函数inet_addr()指定接收的IP,其实这里只是假如你有双网卡的时候,有需要可以绑定其中一个IP,htonl(INADDR_ANY)或0最实在。
贴下一段初始化的代码
bzero(&socket_info.server_addr, sizeof(socket_info.server_addr));
socket_info.server_addr.sin_family = AF_INET;
socket_info.server_addr.sin_addr.s_addr = 0; //htonl(INADDR_ANY);
socket_info.server_addr.sin_port = htons(PORT);
socket_info.descriptor_TCP_server = socket(AF_INET, SOCK_STREAM , 0);//UDP: SOCK_DGRAM TCP:SOCK_STREAM
if (socket_info.descriptor_TCP_server == -1)
{
perror ("socket call failed");
exit(errno);
}
if(bind(socket_info.descriptor_TCP_server, //将套接口和进程联系起来
(struct sockaddr *)&socket_info.server_addr ,
sizeof(socket_info.server_addr)) == -1 )
{
perror("bind TCP");
exit(errno);
}
2、TCP与UDP的选择使用上,UDP速度快不管数据完整不,TCP其实可以理解成UDP加检测数据(个人观点)。而我需要检验数据,但是数据传输肯定是要用UDP,所以一开始是想纯用UDP实现,当然需要自己写检验的相关代码,后来发现还要来回连接,麻烦哦...咨询了一同事的思路:TCP+UDP,TCP管连接和来回的要求重发数据等操作,而UDP则只管发送数据,效果感觉还行。至少比用纯UDP做实在。
3、TCP的connect函数
int connect_server(void)
{
int savefl, ret;
fd_set set;
struct timeval tival;
tival.tv_sec = 10;
tival.tv_usec = 0;
//设置为非阻塞
savefl = fcntl(socket_info.socket_descriptor_TCP, F_GETFL);
if( fcntl(socket_info.socket_descriptor_TCP, F_SETFL, savefl | O_NONBLOCK) == -1)
{
perror("trying to set input socket to non-blocking");
return 1;
}
//连接成功
if (connect(socket_info.socket_descriptor_TCP,
(struct sockaddr *)&socket_info.address,
sizeof(socket_info.address)) == 0)
{
if( fcntl(socket_info.socket_descriptor_TCP, F_SETFL, savefl) == -1) //设置为阻塞
{
perror("trying to set input socket to blocking");
return 1;
}
return 0;
}
else
{
if (errno != EINPROGRESS)
{
count_connect ++;
perror("Error: connect..2");
goto err;
}
else
{
FD_ZERO(&set);
FD_SET(socket_info.socket_descriptor_TCP, &set);
ret = select(socket_info.socket_descriptor_TCP + 1, NULL, &set, NULL, &tival);
if (ret == -1)
{
perror("Error: select");
goto err;
}
else if(ret == 0)
{
fprintf(stderr, "timeout\n");
goto err;
}
if( ret > 0)
{
if(FD_ISSET (socket_info.socket_descriptor_TCP,&set))
{
int error = 0;
socklen_t len = sizeof (error);
if(getsockopt(socket_info.socket_descriptor_TCP, SOL_SOCKET, SO_ERROR, &error, &len) < 0)
{
printf ("Error: getsockopt fail,connected fail\n");
goto err;
}
if (error == ETIMEDOUT) {
printf ("Error: connected timeout\n");
goto err;
}
if(error == ECONNREFUSED) {
printf("Error: No one listening on the remote address.\n");
goto err;
}
}
}
}
if( fcntl(socket_info.socket_descriptor_TCP, F_SETFL, savefl) == -1) //设置为阻塞
{
perror("trying to set input socket to blocking");
return 1;
}
return 0;
}
err:
printf("errno: %m \n",errno);
return 1;
}
4、UDP的recvfrom最好是非阻塞的。
专栏文章内容及配图由作者撰写发布,仅供工程师学习之用,如有侵权或者其他违规问题,请联系本站处理。 联系我们
相关推荐
摩尔斯微电子推出MM8108:全球体积最小、速度最快、功耗最低、传输距离最远的Wi-Fi芯片
Allegro MicroSystems重新定义传感技术,推出全新紧凑型封装电流传感器IC
基于DSP的高动态GPS接收机关键技术讨论
Microchip Android系统配件开发平台
村田新品 | 配备MCU、支持多无线标准的微小型通信模块
基于DSP的电力线载波OFDM调制解调器
端到端来了,激光雷达就没有明天了吗?
高频、薄型,且可像折纸一样弯曲加工的村田多层LCP基板
申请新会员——yansm
[灌水]斑竹的新证
铃木电梯安全回路电路(B)
铃木电梯安全回路电路(A)
基于DSP的低功耗高速数据采集系统
荣芯半导体:实现与客户共进退的定制化服务
使用串口下载vxworks映象的方法
Microchip低成本dsPIC® DSC电机控制方案
基于DSP的仿生机器蟹多关节控制系统的实现
日立GVF电梯安全回路电路
Vishay安规电容-汽车EMI解决方案的优质选择
东芝CVl80电梯安全回路电路
关于PCB方案!!!
现在这边热闹啊.....
比亚迪为什么没有拿下电耗水平领先的标签?
MPLAB® ICD 3的使用演示
Microchip低成本带CAN控制器的单片机PIC18F66K80
基于DSP的USB口数据采集分析系统
电子技术如何助力高铁节能?
Microchip dsPIC33 DSC数字电源
BOE(京东方)全新概念级“AI视听中心”亮相CES 2025
通力3000电梯安全回路电路(1)