标签: sendto

通过C中的套接字传递结构

我试图将整个结构从客户端传递到服务器,反之亦然.让我们假设我的结构如下

struct temp {
  int a;
  char b;
}
Run Code Online (Sandbox Code Playgroud)

我使用sendto并发送结构变量的地址,并使用recvfrom函数在另一侧接收它.但我无法获得接收端发送的原始数据.在sendto函数中,我将接收到的数据保存到struct temp类型的变量中.

n = sendto(sock, &pkt, sizeof(struct temp), 0, &server, length);
n = recvfrom(sock, &pkt, sizeof(struct temp), 0, (struct sockaddr *)&from,&fromlen);
Run Code Online (Sandbox Code Playgroud)

其中pkt是struct temp类型的变量.

虽然我收到8字节的数据,但如果我尝试打印它只是显示垃圾值.任何帮助修复它?

注意: 不得使用第三方库.

编辑1:我对这个序列化概念真的很陌生.但是如果不进行序列化,我不能通过套接字发送结构?

EDIT2:当我尝试使用sendtorecvfrom函数发送字符串或整数变量时,我在接收端正确接收数据.为什么不在结构的情况下?如果我不必使用序列化功能,那么我应该单独发送结构的每个成员吗?这实际上不是一个合适的解决方案,因为如果有'n'个成员,那么只有添加'n'个代码行才能发送或接收数据.

c sockets sendto recv

48
推荐指数
4
解决办法
8万
查看次数

unix socket错误14:EFAULT(错误地址)

我有一个非常简单的问题,但我整个周末都找不到任何答案.我正在使用该sendto()函数,它返回错误代码14:EFAULT.手册页将其描述为:

"An invalid user space address was specified for an argument."
Run Code Online (Sandbox Code Playgroud)

我确信这是在谈论我指定的IP地址,但现在我怀疑它可能是它所指的消息缓冲区的内存地址 - 我无法在任何地方找到任何澄清,任何人都可以清除这一点吗?

谢谢,J

c sockets udp sendto

16
推荐指数
1
解决办法
3万
查看次数

如何实现"发送到点燃"链接?

我正在尝试找出如何创建一个链接,将我网站上的当前页面/文章发送给用户的Kindle设备.我一直没能找到很多关于它,但我知道这是可以做到,因为我看到它在这里:http://openlibrary.org/works/OL258709W/King_Henry_VI和Instapaper的提供了这个功能,看到的图像.有谁知道怎么做,甚至从哪里开始?

发送到kindle

我已经看到其他帖子提出这个问题了,但它们是从一段时间前开始的,当时它是不可能的,所以没有答案,现在它是可能的.

javascript amazon kindle sendto

9
推荐指数
1
解决办法
2627
查看次数

sikuli python脚本上的.sendto()方法在Windows上不起作用

我在Windows上开发了一个使用此代码的sikuli python脚本:

from socket import AF_INET, SOCK_DGRAM
import sys
import socket
import struct, time

host = "pool.ntp.org"
port = 123
buf = 1024
address = (host,port)
msg = '\x1b' + 47 * '\0'

# reference time (in seconds since 1900-01-01 00:00:00)
TIME1970 = 2208988800L # 1970-01-01 00:00:00

# connect to server
client = socket.socket( AF_INET, SOCK_DGRAM)
client.sendto(msg, address)
msg, address = client.recvfrom( buf )

t = struct.unpack( "!12I", msg )[10]
t -= TIME1970

current_time = time.ctime(t).replace(" "," ")
Run Code Online (Sandbox Code Playgroud)

代码在linux下或在Windows上的python脚本中正常工作,但是如果我在Windows上的sikulix上使用此代码它会崩溃(在line => …

python sockets jython sendto sikuli

8
推荐指数
1
解决办法
284
查看次数

在C程序中发送ICMP数据包

我正在尝试用C创建一个ICMP ping测试程序,但是在成功发送数据包时遇到了困难.该sendto函数返回字节数和所有内容但实际上没有发送数据包.我已经在目标计算机上使用WireShark验证了这一点.主机上的常规ping工作正常,但在WireShark中显示.

这是我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <netinet/in.h>
#include <netinet/in_systm.h>
#include <netinet/ip.h>
#include <netinet/ip_icmp.h>
#include <string.h>
#include <arpa/inet.h>
#include <sys/select.h>
#include <sys/time.h>

unsigned short cksum(unsigned short *addr, int len);

int main(int argc, char *argv[])
{
    int sock;
    char send_buf[400], recv_buf[400], src_name[256], src_ip[15], dst_ip[15];
    struct ip *ip = (struct ip *)send_buf;
    struct icmp *icmp = (struct icmp *)(ip + 1);
    struct hostent *src_hp, *dst_hp;
    struct sockaddr_in src, dst;
    struct timeval t;
    int …
Run Code Online (Sandbox Code Playgroud)

c ping icmp sendto

6
推荐指数
1
解决办法
9039
查看次数

在某些设备上使用SENDTO发送带附件的电子邮件不起作用

起初你会想到"等等,这个问题是重复的!".继续阅读.

我正在尝试使用Intent ACTION_SENDTO(使用电子邮件URI作为数据),以便只有电子邮件应用程序响应.

(使用ACTION_SEND启动标准"SEND"选择器而没有数据URI意味着非电子邮件应用程序(如Google Drive)也会响应).

我的问题是附件适用ACTION_SEND于所有设备,但是 - 当ACTION_SENDTO只使用某些设备正确附加文件时.Nexus 7可以使用,但三星Galaxy Tab和Acer Iconia 没有.

您可以在下面看到不同的方法:

    String email    = getActivity().getResources().getString(R.string.supportEmail);
    String subject  = getActivity().getResources().getString(R.string.sFeedback);
    subject         = String.format(subject, 
                      getActivity().getResources().getString(R.string.productName));
    String content  = getActivity().getResources().getString(R.string.whatFeedbackWouldYouLikeToProvide) + "\n\n" + 
                      mMessage.getText().toString();
    File toSend     = new File(outfile);

    if(toSend.exists()) {
        Log.e("Feedback", "File path: " + toSend.getAbsolutePath());

        Intent emailIntent = new Intent(android.content.Intent.ACTION_SENDTO);
        emailIntent.setData(Uri.parse("mailto:" +email));
        emailIntent.putExtra(android.content.Intent.EXTRA_STREAM,   Uri.fromFile(toSend));
        emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT,  subject);               
        emailIntent.putExtra(android.content.Intent.EXTRA_TEXT,     content);  

    /*  Intent emailIntent = new Intent(Intent.ACTION_SEND);
        emailIntent.setType("message/rfc822");
        emailIntent.putExtra(Intent.EXTRA_EMAIL  , new String[]{email}); …
Run Code Online (Sandbox Code Playgroud)

android sendto

6
推荐指数
2
解决办法
5333
查看次数

UDP响应

UDP不会发回任何确认,但它会发送任何响应吗?

我已经设置了客户端服务器UDP程序.如果我让客户端向不存在的服务器发送数据,那么客户端会收到任何响应吗?

我的假设是;

客户端 - >广播服务器地址(ARP)服务器 - >使用其mac地址(ARP)回复客户端客户端向服务器发送数据(UDP)

在任何情况下,客户端只会收到ARP响应.如果服务器存在与否,它将不会获得任何UDP响应?

客户端使用sendto函数发送数据.我们可以在sendto调用后获取错误信息.

所以我的问题是当客户端没有得到任何响应时这些信息是如何可用的.错误代码可以从WSAGetLastError获取.

我试图将数据发送到不存在的主机并发送到调用成功.根据文档,它应该失败,返回值为SOCKET_ERROR.

有什么想法吗??

sockets udp sendto

5
推荐指数
2
解决办法
9997
查看次数

套接字编程:sendto始终以errno 22(EINVAL)失败

我总是没有发送任何字节,使用此代码的错误为22(EINVAL,无效参数).在destination_host别处设置并且已知有效,所以我真的不知道发生了什么. MAXMSGSIZE是1000.没有错误或警告.我正在编译-Wall -Werror -pedantic

char *data_rec;
u_int data_len;

int sockfd;
uint16_t *ns;
struct sockaddr_in address;
struct sockaddr *addr;

char *ip;

int i;
int errno;
int bytes_sent;

data_len = MAXMSGSIZE;
data_rec = malloc(sizeof(char)*MAXMSGSIZE);
ns = malloc(MAXMSGSIZE*sizeof(uint16_t));
ip = malloc(MAXMSGSIZE*sizeof(char));

data_rec = "some random test stuff";

sockfd = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
if(sockfd<0) {
    printf("socket() failed\n");
}

inet_ntop(AF_INET,destination_host->h_addr,ip,MAXMSGSIZE);
memset(&address, 0, sizeof(address));
address.sin_family = AF_INET;
address.sin_port = htons(theirPort);
address.sin_addr.s_addr = (unsigned long)ip;

addr = (struct sockaddr*)&address;
bind(sockfd,addr,sizeof(address));
/*Convert the message …
Run Code Online (Sandbox Code Playgroud)

c sockets udp sendto

5
推荐指数
2
解决办法
3万
查看次数

Python 3 - 验证sendto()成功

我有2个UDP响应到目标IP,一个接一个:

sendsock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
sendsock.bind(('%s' % ip_adr, 1036))

#send first packet
ok_response = "Reception Success, more to come"
str2bytes = bytes(ok_response,'utf-8')
sendsock.sendto(str2bytes, ("%s" % phone.ip_addr, int(phone.sip_port)))

#send second packet
ok_response = "Fun data here"
str2bytes = bytes(ok_response,'utf-8')
sendsock.sendto(str2bytes, ("%s" % phone.ip_addr, int(phone.sip_port)))
Run Code Online (Sandbox Code Playgroud)

我可以看到Wireshark第二个数据包被发送.但第一个似乎被忽略了.

除非有人能在我的代码中看到打嗝,是否有办法在每个sendsock.sendto()实例上执行if语句,以确保代码在被确认为已发送之前不会继续?

另外,我应该关闭sentock吗?

python udp sendto python-3.x

5
推荐指数
1
解决办法
1860
查看次数

如何通过RAW套接字发送修改后的IPv6数据包?

我正在尝试通过 C Linux 中的 RAW 套接字发送自定义 IPv6 标头。
我已经使用 IP_HDRINCL 套接字选项在 IPv4 中取得了成功,但是,IPv6 没有等效的选项。
在这里找到了一个解决方法,建议使用socket(AF_INET6, SOCK_RAW, IPPROTO_RAW)与启用 IP_HDRINCL 套接字选项具有相同的效果。套接字已成功创建,并且在使用带有修改后的标头的函数

之前我不会收到任何错误。sendto

我这样设置套接字:

static int socketFd = 0;
static struct sockaddr_in6 remote;

int main()
{
    socketFd = socket (PF_INET6, SOCK_RAW, IPPROTO_RAW);

    if (socketFd < 0)
    {
        printf ("An error ocurred while creating the socket.\n");
        exit (2);
    }

    remote.sin6_family = AF_INET6;
    remote.sin6_port = htons (25000);

    if (inet_pton (AF_INET6, "fd00:c0de::70d6:4ab9:115d:8cda", &(remote.sin6_addr)) != 1)
    {
        close (socketFd);
        printf ("Unable to …
Run Code Online (Sandbox Code Playgroud)

c linux ipv6 raw-sockets sendto

5
推荐指数
1
解决办法
7304
查看次数

标签 统计

sendto ×10

c ×5

sockets ×5

udp ×4

python ×2

amazon ×1

android ×1

icmp ×1

ipv6 ×1

javascript ×1

jython ×1

kindle ×1

linux ×1

ping ×1

python-3.x ×1

raw-sockets ×1

recv ×1

sikuli ×1