*Linux转windows开发环境下的网络编程

1 篇文章 0 订阅
1 篇文章 0 订阅

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;

}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值