C++socket编程,数据转为网络字节序的问题htons

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++socket编程,数据转为网络字节序的问题htons相关的知识,希望对你有一定的参考价值。

htons是将一个 unsigned short转为网络字节序,即big endian

但是我在很多开源的socket程序中发现有些地方将一个int变量传递给了htons函数。这样没有问题吗?

还有,如果需要将传输的int型的数据转换为网络字节序,请问有用哪个函数? 我现在是自己编写函数来转换的,但是既然有htons函数,应该也有相应的将 int 转变为的网络字节序的函数吧?

参考技术A C语言只规定short <= int <=long int。具体还得看具体的编译器
htons() host to network short
htonl() host to network long
ntohl() network to host long
ntohs() network to host short
参考技术B uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);
uint32_t ntohl(uint32_t netlog);
uint16_t ntohs(uint16_t netshort);

这种时候你man一下就好了啊

C语言socket编程

客户端程序:

#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib")
#define PORT 3490 /* 客户机连接远程主机的端口*/
#define MAXDATASIZE 100 /* 每次可以接收的最大字节*/

int _tmain(int argc, _TCHAR* argv[])

WORD wVersionRequested;
WSADATA wsaData;
int err = 0 ,rval = 0 ;
SOCKET fd;
struct sockaddr_in servaddr;
struct hostent* hp;
char buf[1024] = "";
wVersionRequested = MAKEWORD( 2, 2 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 )
return -1;
if ((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0)

printf("Can not create socket!");
exit(2);

servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(PORT);
servaddr.sin_addr.S_un.S_addr=inet_addr("172.25.20.182");
memset(servaddr.sin_zero, 0, sizeof(servaddr.sin_zero));

//和服务器创建连接
rval = connect(fd, (sockaddr*)&servaddr, sizeof(servaddr));
if (rval < 0)
//创建连接失败
printf("Can not create connect!");
exit(3);

else
for(;;)

memset(buf, 0, 1024);
printf("Please input a line to server:");
scanf("%s",&buf);
//向服务器发送信息
rval = send(fd, buf, strlen(buf) + 1,0);
if(rval < 0)
printf("Write error!");
if((rval=recv(fd,buf,sizeof(buf),0)<0))
perror("reading stream message");
if(rval==0)
printf("server said:%s\n",buf);


closesocket(fd);
exit(5);

return 0;


现在要在这个基础上设置一个连接服务器的密码,怎么弄 求详细代码

参考技术A 这不是很简单,加个
在send前面加个
char password[20]="12345"
printf("please enter the password:");
scanf("%s",importpassword);
if(0==strcmp(password,importpassword))

连接。。。send();

else 退出。或者这里还可以写个循环输入也可
如果需要用户名就麻烦多了。不多说了,求采纳,有问必答本回答被提问者采纳
参考技术B send用户名和密码,然后再服务器判断这段字符串的账号密码是否符合,然后客户端recv,如果recv的字符串是登录成功,才进行下面操作.否则就提示用户名和密码有误.

以上是关于C++socket编程,数据转为网络字节序的问题htons的主要内容,如果未能解决你的问题,请参考以下文章

Linux网络之socket编程

网络字节序的转换函数

网络篇套接字编程

网络篇套接字编程

网络篇套接字编程

C语言socket编程