上位机socket 通信 编程(mfc)

来源:互联网 发布:房屋格局设计软件 编辑:程序博客网 时间:2024/06/05 16:21

/*

*软件:vs2005

*目标:实现socket通信代替原有的串口

*协议:udp

*本文只是记载开发过程中的小细节与遇到的问题

*/

**************************************

INT_PTR nRes;
CChose chose;


nRes = chose.DoModal();
if (IDD_CHOSE == nRes)
return;


************************************** //弹出窗口-------mark


本人选择创建socket的方式不是用Windows的API,是用C写的库,封装成一个类,因为win的API的接口不是很方便,刚好自己也有一个项目就做成库了,

使用起来感觉还不错。

***

UDP通信流程:


接下来是自己写一个小代码(服务器):

PS:以下代码只是示范

// 1,创建一个UDP套接字
int fd = Socket(AF_INET, SOCK_DGRAM, 0);


// 2,绑定 IP + PORT
struct sockaddr_in srvaddr;
socklen_t len = sizeof(srvaddr);
bzero(&srvaddr, len);


srvaddr.sin_family = AF_INET;
srvaddr.sin_addr.s_addr = htonl(INADDR_ANY); // 自动获取本机任意一个IP
srvaddr.sin_port = htons(atoi(argv[1])); // 从命令行手工指定


Bind(fd, (struct sockaddr *)&srvaddr, len);


char msg[SIZE];
struct sockaddr_in cliaddr;


bzero(msg, SIZE);
bzero(&cliaddr, sizeof(cliaddr));


recvfrom(fd, msg, SIZE, 0,(struct sockaddr *)&cliaddr, &len);




receive和send的超时设置:

int time_rcv=10000;//10s
int time_send=10000;//10s

int error_rcv=setsockopt(socket1, SOL_SOCKET,SO_RCVTIMEO, (char *)&time_rcv,sizeof(time_rcv));

int error_send=setsockopt(socket1, SOL_SOCKET,SO_SNDTIMEO, (char *)&time_send,sizeof(time_send));


作为上位机,功能上是主动的发送命令,所以可以把rcv的上层封装改为先sand一个带命令的空包然后再rcv。//**因软件需求而异


注意在不同的主机上进行通信,必须要注意字节序,可以使用网络字节序进行中转。

例如:htons(atoi(argv[1]));     


接下来是c++里的数据类型问题:

CString   char   srting


1.char ->CString  

char b[]={"test"};

CString  p;

p=b;

2.sting->char

string p;

p="test";

char b[5]

p.copy(b,p.length(),0);


3.CString ->char

CString p;

char b[50];

p="test";

 for(int i=0;i<p.GetLength();i++){

b[i]=p.GetAt(i)

}


*************************************************

char 型数组的倒序函数:

strrev(char *)

两个CString 的比较函数:

CString p,o;

int  i=p.Compare(o);

返回0相等

两个CString是否为子数组函数:

CString o,p;

int i=p.Find(o)

返回-1表示p里没有o这个字符串


对内存操作的函数:

memset();//常用清零

memcpy();//复制

memcpy_s();//从n字节开始复制datalen长度


对于网络通信,肯定有IP地址,在MFC中,有IP地址的控件,对于怎么把从控件输入的IP转成char型数组:

char buf[50];

BYTE  f1, f2, f3, f4;
m_pIPaddress.GetAddress(f1, f2, f3, f4);
m_strIp.Format(("%d.%d.%d.%d"), f1, f2, f3, f4);//IP转换成字符串StringA

strcpy(buf, m_strIp.GetString());

//m_pIPaddress为控件变量//m_strIp为StringA类变量


数组连接问题:

1 两个CString 连接:

CString o,p;

o=o+p;

2 两个char连接

char b[],h[];

 sprintf(b,"%s%s"b,h);




--------------------------------------------------------------------------------------------------------------------------

希望对读者帮助

交流方式:274598809@qq.com


----------------------------------------------------------------------------------------------------------------------------









1 0