猿问

您好,请问该怎样用socket的sendto函数发送十六进制呢?

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了,应该怎样才能正确的将数组中的元素发送出去呢?

慕容3067478
浏览 409回答 3
3回答

一只斗牛犬

很简单,第一次的时候p跑到str里面'\0'的位置停了,然后'\0'被换成了*val,str数组就没有结束符了;所以以后的while循环都会因为len=50越界而return了,下面的*p=*val执行不到的。第一次打印str是原来的字符串+一串乱码吧,危险呢。

智慧大石

int PASCAL FAR sendto( SOCKET s, const char FAR* buf, int len, int flags,const struct sockaddr FAR* to, int tolen);你定义个结构指针,buf这个参数填这个指针,len填sizeof(结构体),这样就可以了。

鸿蒙传说

 相关函数:send, sendmsg, recv, recvfrom, socket头文件:#include<sys/types.h> #include <sys/socket.h>定义函数:int sendto(ints, 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_inaddr;char buffer[256];//建立socketif(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);}}
随时随地看视频慕课网APP
我要回答