C++ 中,怎样用socket的sendto函数发送十六进制呢?
sendto的原形如下:intPASCALFARsendto(SOCKETs,constcharFAR*buf,intlen,intflags,conststructso...
sendto的原形如下:
int PASCAL FAR sendto( SOCKET s, const char FAR* buf, int len, int flags,
const struct sockaddr FAR* to, int tolen)
函数的每二个参数为需要发送的数据,它是指向char(有符号数)型的指针,发送的数据最大只能为127吧。。
下面的BYTE(无符号)数组需要发送出去。
BYTE buf[5] = {128,125,101,02,59};
但数组buf中的第0个元素,已经大于127了,应该怎样才能正确的将数组中的元素发送出去呢? 展开
int PASCAL FAR sendto( SOCKET s, const char FAR* buf, int len, int flags,
const struct sockaddr FAR* to, int tolen)
函数的每二个参数为需要发送的数据,它是指向char(有符号数)型的指针,发送的数据最大只能为127吧。。
下面的BYTE(无符号)数组需要发送出去。
BYTE buf[5] = {128,125,101,02,59};
但数组buf中的第0个元素,已经大于127了,应该怎样才能正确的将数组中的元素发送出去呢? 展开
4个回答
展开全部
相关函数:send, sendmsg, recv, recvfrom, socket
头文件:#include
<sys/types.h> #include <sys/socket.h>
定义函数:int sendto(int
s, const void * msg, int len, unsigned int flags, const struct sockaddr * to,
int tolen);
函数说明:sendto() 用来将数据由指定的socket 传给对方主机. 参数s 为已建好连线的socket, 如果利用UDP协议则不需经过连线操作. 参数msg 指向欲连线的数据内容, 参数flags 一般设0, 详细描述请参考send(). 参数to 用来指定欲传送的网络地址, 结构sockaddr 请参考bind(). 参数tolen 为sockaddr 的结果长度。
返回值:成功则返回实际传送出去的字符数, 失败返回-1, 错误原因存于errno 中。
范例:
#include <sys/types.h>
#include <sys/socket.h>
#include
<netinet.in.h>
#include <arpa.inet.h>
#define PORT 2345
/*使用的port */
main()
{
int sockfd, len;
struct sockaddr_in
addr;
char buffer[256];
//建立socket
if(sockfd =
socket(AF_INET, SOCK_DGRAM, 0)) < 0)
{
perror
("socket");
exit(1);
}
//填写sockaddr_in 结构
bzero(&addr, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(PORT);
addr.sin_addr = hton1(INADDR_ANY);
if(bind(sockfd, &addr, sizeof(addr)) < 0)
{
perror("connect");
exit(1);
}
while(1)
{
bezro(buffer, sizeof(buffer));
len = recvfrom(socket, buffer,
sizeof(buffer), 0, &addr &addr_len);
//显示client 端的网络地址
printf("receive from %s\n ", inet_ntoa(addr.sin_addr));
//将字串返回给client 端
sendto(sockfd, buffer, len, 0, &addr,
addr_len);
}
}
头文件:#include
<sys/types.h> #include <sys/socket.h>
定义函数:int sendto(int
s, const void * msg, int len, unsigned int flags, const struct sockaddr * to,
int tolen);
函数说明:sendto() 用来将数据由指定的socket 传给对方主机. 参数s 为已建好连线的socket, 如果利用UDP协议则不需经过连线操作. 参数msg 指向欲连线的数据内容, 参数flags 一般设0, 详细描述请参考send(). 参数to 用来指定欲传送的网络地址, 结构sockaddr 请参考bind(). 参数tolen 为sockaddr 的结果长度。
返回值:成功则返回实际传送出去的字符数, 失败返回-1, 错误原因存于errno 中。
范例:
#include <sys/types.h>
#include <sys/socket.h>
#include
<netinet.in.h>
#include <arpa.inet.h>
#define PORT 2345
/*使用的port */
main()
{
int sockfd, len;
struct sockaddr_in
addr;
char buffer[256];
//建立socket
if(sockfd =
socket(AF_INET, SOCK_DGRAM, 0)) < 0)
{
perror
("socket");
exit(1);
}
//填写sockaddr_in 结构
bzero(&addr, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(PORT);
addr.sin_addr = hton1(INADDR_ANY);
if(bind(sockfd, &addr, sizeof(addr)) < 0)
{
perror("connect");
exit(1);
}
while(1)
{
bezro(buffer, sizeof(buffer));
len = recvfrom(socket, buffer,
sizeof(buffer), 0, &addr &addr_len);
//显示client 端的网络地址
printf("receive from %s\n ", inet_ntoa(addr.sin_addr));
//将字串返回给client 端
sendto(sockfd, buffer, len, 0, &addr,
addr_len);
}
}
展开全部
int PASCAL FAR sendto( SOCKET s, const char FAR* buf, int len, int flags,
const struct sockaddr FAR* to, int tolen);
你定义个结构指针,buf这个参数填这个指针,len填sizeof(结构体),这样就可以了。
const struct sockaddr FAR* to, int tolen);
你定义个结构指针,buf这个参数填这个指针,len填sizeof(结构体),这样就可以了。
追问
出现错误:error C2440: 'type cast' : cannot convert from 'struct 结构体to 'char *',难道我定义的不对吗?
具体怎样操作呢,烦请举例定义下.
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
很简单,第一次的时候p跑到str里面'\0'的位置停了,然后'\0'被换成了*val,str数组就没有结束符了;所以以后的while循环都会因为len=50越界而return了,下面的*p=*val执行不到的。第一次打印str是原来的字符串+一串乱码吧,危险呢。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
直接发,没问题。只要你收发两边处理好就行了。
更多追问追答
追问
直接发有问题啊,关键是发或收两边怎样处理啊.
追答
你收发两边都按byte处理就行了。那个buf其实就是个容器,它每个字节8位,是够的。当然可以传。没问题的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询