Linux转windows开发环境下的网络编程(含十六进制发送转化)
如果你有Linux的网络编程基础,那么转windows就简单的多了,我们所需要注意的就是windows开发环境下的头文件和函数有点不同,但总体来说方法是没有变化的。
我在这就介绍一个客户端的基本思路
创建socket网络套接字——>配置协议族 端口号 IP ——>connect();获取本地连接 ——>send();recv();发送和接收——>关闭套接字closesocket();
注意:
(1)send();发送报文到服务器,如果长时间得不到回复,recv();就会出现问题
(2)如果服务器只接收16进制的报文,发送时需要以16进制发送,也就是说需要转换为16进制BYTE型数组发送
(3)recv();需要长时间监听等待数据
(4)如果获取的回复报文也是16进制的,那么我们接收到的也是BYTE型数组,如果直接用char缓存的话,会出现乱码等情况
以下是我的代码,希望能对刚刚转型的你有所帮助
#include <WINSOCK2.H>
#include <stdio.h>
#pragma comment(lib,"ws2_32.lib")
void delay(int i);
int Str2Hex(char* str, BYTE *data);
int main()
{
int err;
WORD versionRequired;
WSADATA wsaData;
versionRequired=MAKEWORD(1,1);
err=WSAStartup(versionRequired,&wsaData);//协议库的版本信息
if (!err)
{
printf("客户端嵌套字已经打开!\n");
}
else
{
printf("客户端的嵌套字打开失败!\n");
return 0;//结束
}
SOCKET clientSocket=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN clientsock_in;
clientsock_in.sin_addr.S_un.S_addr=inet_addr("192.168.1.107");
clientsock_in.sin_family=AF_INET;
clientsock_in.sin_port=htons(7777);
int ret = connect(clientSocket,(SOCKADDR*)&clientsock_in,sizeof(SOCKADDR));//开始连接
if(ret == -1 )
{
printf("connect: error");
}
char *sendBuf="FEFEFEFE00254B545950000705040200011761EDEDEDED";
BYTE data[250]={0};
int S = Str2Hex(sendBuf,data);
/*while(1)
{
ret = send(clientSocket, (const char*)data ,S+1,0);
if(ret == -1)
{
printf(" send: error");
}
delay(1000000);
}*/
for(int l=0;l<3;l++)
{
ret = send(clientSocket, (const char*)data ,S,0);
if(ret == -1)
{
printf(" send: error");
}
delay(1000000);
}
BYTE receiveBuf[41]={0};
while(1)
{
ret = recv(clientSocket,(char *)receiveBuf,41,0);
printf("***************recv******************\n");
if(ret == SOCKET_ERROR)
{
printf("recv :ERROR");
}
//char str[100];
//int D = Str3Hex(receiveBuf, str);
for(int i= 0;i<41;i++)
{
printf("%x",receiveBuf[i]);
}
//printf("***************printf******************\n");
delay(100000);
}
closesocket(clientSocket);
WSACleanup();
return 0;
}
/********************
delay:延时函数
@i:
延时时长
返回值:
无
***********************/
void delay(int i)
{
int x, y;
for(x=i; x>0; x--)
for(y=1000; y>0; y--);
}
/**************************
HexChar:将16进制字符由ASCII码转为相应大小的16进制数
@c:
需要转换的字符
返回值:
返回转换后的16进制数
***************************/
char HexChar(char c)
{
if((c>='0')&&(c<='9'))
return c-'0';//16进制中的,字符0-9转化成10进制,还是0-9
else if((c>='A')&&(c<='F'))
return c-'A'+10;//16进制中的A-F,分别对应着11-16
else if((c>='a')&&(c<='f'))
return c-'a'+10;//16进制中的a-f,分别对应也是11-16,不区分大小写
else
return 0x10; // 其他返回0x10
}
/****************************
Str2Hex:
字符串以空格为间隔转换为对应的16进制数并存放在BYTE型(typdef unsigned char BYTE)数组中
@str:
需要转换的字符串
@data:
存放转换后BYTE的数组
返回值:
转换后的数组大小
**************************/
int Str2Hex(char* str, BYTE *data)
{
int t,t1;
int rlen=0,len=strlen(str);
if(len==1)
{
char h=str[0];
t=HexChar(h);
data[0]=(BYTE)t;
rlen++;
}
for(int i=0;i<len-1;)
{
char l,h=str[i];
if(h==' ')
{
i++;
continue;
}
i++;
if(i>=len)
break;
l=str[i];
t=HexChar(h);
t1=HexChar(l);
if((t==16)||(t1==16))
break;
else
t=t*16+t1;
i++;
data[rlen]=(BYTE)t;
rlen++;
}
return rlen;
}