百度
360搜索
搜狗搜索

sendto函数,udpsendto返回码是128详细介绍

本文目录一览: C++ 中,怎样用socket的sendto函数发送十六进制呢?

int PASCAL FAR sendto( SOCKET s, const char FAR* buf, int len, int flags,
const struct sockaddr FAR* to, int tolen);
你定义个结构指针,buf这个参数填这个指针,len填sizeof(结构体),这样就可以了。
很简单,第一次的时候p跑到str里面'\0'的位置停了,然后'\0'被换成了*val,str数组就没有结束符了;所以以后的while循环都会因为len=50越界而return了,下面的*p=*val执行不到的。第一次打印str是原来的字符串+一串乱码吧,危险呢。
直接发,没问题。只要你收发两边处理好就行了。
  相关函数:send, sendmsg, recv, recvfrom, socket
头文件:#include

#include

定义函数: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

#include

#include

#include

#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);

}

}

linux 网络编程 sendto 问题

sendto(经socket传送数据)
相关函数 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 中。
错误代码 EBADF 参数s非法的socket处理代码。
EFAULT 参数中有一指针指向无法存取的内存空间。
WNOTSOCK canshu s为一文件描述词,非socket。
EINTR 被信号所中断。
EAGAIN 此动作会令进程阻断,但参数s的soket为补课阻断的。
ENOBUFS 系统的缓冲内存不足。
EINVAL 传给系统调用的参数不正确。
范例 #include < sys/types.h >
#include < sys/socket.h >
# include

#include

#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);”

}

}

显然这里没有绑定啊,直接创建一个socket怎么能用呢?查一下bind函数吧。

从send函数和sendto函数参数的不同看TCP和UDP的差别

一般情况下: send(),recv()用于TCP,sen一般情况下: send(),recv()用于TCP,sendto()及recvfrom()用于UDP 但是send(),recv()也可以用于UDP,sendto()及recvfrom()也可以用于TCP send函数 int send( SOCKET s, const char FAR *buf, int len,...

int sendto() 当返回值大于0 时表示发送成功,相反则失败 那这个函数的返回值我怎么判断

根据你的描述你可以直接使用if来判断比如
if(sendto()>0)
{
}
else
{
}
{}内是你要进行的其他操作
if(sendto()>0)
{
succeed;
}
else
{
faild;
}
返回值:成功则返回实际传输的字节数,失败返回-1,错误原因存于errno中。
函数原型:int sendto(int s, const void *msg, int len, unsigned int flag, const struct sockaddr *to, int tolen);
也就是说
if((n = sendto()) == 1)
{
if (sockfd == EINTR)
close(sokfd);//意思就是判断这个socket是否已经断开,其他原因可以处理再shento。
}
errno参数

sendto()函数中参数to在实际中使用一般要加(struct sockaddr )为什么?

sendto()的参数类型是sockaddr*,但平时使用sockaddr_in赋值更方便,所以传递参数时进行强制类型转换成sockaddr*。
sockaddr_in结构和sockaddr结构有效字节数都是16字节,所以地址互转使用没问题。
sockaddr_in结构单独定义了port和ip属性,可以直接操作赋值。而sockaddr只定义了一个内存块,你直接操作sockaddr要对port ,ip值按格式进行内存拷贝很麻烦,关键你不知道IP和PORT应该应拷到具体地址上的哪个位置就更麻烦。
看看下面定义你就明白了。
struct sockaddr {
u_short sa_family; /* address family */
char sa_data[14]; /* up to 14 bytes of direct address */
};
struct sockaddr_in {
short sin_family;
u_short sin_port;
struct in_addr sin_addr;
char sin_zero[8];
};
因为sendto的参数要的就是
(struct sockaddr *)
类型的参数,这个结构可以支持多种地址类型,典型的例子就是ipv4和ipv6。
但是通常你的接受端的地址是通过地址解析得到的,sockaddr_in(对应ipv4)或者是sockaddr_in6(对应Ipv6),而不是struct sockaddr,所以需要类型转换。
至于如何区分指向的到底是什么类型的地址,主要依靠第一个字段ushort sa_family;来区分。
MSDN里面的描述是:
Winsock functions using sockaddr are not strictly interpreted to be pointers
to a sockaddr structure. The structure is interpreted differently in the context
of different address families. The only requirements are that the first
u_short is the address family and the total size of the memory buffer in
bytes is namelen.

udpsendto返回码是128

udpsendto返回码是128。对于sendto()函数,成功则返回实际传送出去的字符数,失败返回-1,错误原因存于errno中。sendto(),是把UDP数据报发给指定地址。

如何修改sendto函数中ip头里的ip

因为sendto的参数要的就是
(struct sockaddr *)
类型的参数,这个结构可以支持多种地址类型,典型的例子就是ipv4和ipv6。
但是通常你的接受端的地址是通过地址解析得到的,sockaddr_in(对应ipv4)或者是sockaddr_in6(对应Ipv6),而不是struct sockaddr,所以需要类型转换。
至于如何区分指向的到底是什么类型的地址,主要依靠第一个字段ushort sa_family;来区分。
MSDN里面的描述是:
Winsock functions using sockaddr are not strictly interpreted to be pointers
to a sockaddr structure. The structure is interpreted differently in the context
of different address families. The only requirements are that the first
u_short is the address family and the total size of the memory buffer in
bytes is namelen.

sendmsg 和sendto的区别

Linux系统调用之send/sendto/sendmsg函数解析功能描述:
发送消息。send只可用于基于连接的套接字,send 和 write唯一的不同点是标志的存在,当标志为0时,send等同于write。
sendto 和 sendmsg既可用于无连接的套接字,也可用于基于连接的套接字。除了套接字设置为非阻塞模式,调用将会阻塞直到数据被发送完。
希望对你有帮助

使用CAsyncSocket::SendTo函数向255.255.255.255发送广播数据,对方不能接收。这个函数屏蔽广播数据吗?

AsyncSocket::SendTo
调用该成员函数的数据发送到特定目标。int SendTo(
const void* lpBuf,
int nBufLen,
UINT nHostPort,
LPCTSTR lpszHostAddress = NULL,
int nFlags = 0
);
int SendTo(
const void* lpBuf,
int nBufLen,
const SOCKADDR* lpSockAddr,
int nSockAddrLen,
int nFlags = 0
);

c++中sendto函数能否向多个端口发送数据

你调用一次往一个客户端发送一条消息,那你调用N次,每次指定不同的客户端地址不就可以往N个客户端发送了嘛~!
SendTo函数中的参数有一个地址和端口,请问这个端口是:将数据从本地的这个不是吧,连接的远程主机只需要本地连接时指定的端口号和ip地址和远程主机的
可参考MSDN“The to parameter can be any valid address in the socket's address family, including a broadcast or any multicast address”,可传到多播地址。
参数struct sockaddr FAR格式
struct sockaddr {
unsigned short sa_family;
char sa_data[14];
};
我可不是什么高手,建议你有养成查看msdn的习惯。
ck2.h并工程中添加库文件ws2_32.lib.
接着加载套接字库所用函数是
WSAStartup( wVersionRequested, &wsaData ); 第一个参数代表的是所要加载的套接字库的版本,第二个参数用于存储返回的版本信息
wVersionRequested = MAKEWORD( 1, 1 );用MAKEWORD来设置版本号的值其中地位代表主版本号
TCP编程:
服务器端的编写:
1. 创建套接字
SOCKET socketSrc = socket(AF_INET, SOCK_STREAM, 0);
第一个参数:指定地址族在1.1版本中只能使用AF_INET
第二个参数:指定套接字的类型在1.1版本中指定指定两种一SOCK_STREAM流式套接字和SOCK_DREAM数据报套接字
第三个参数:指示所要使用的的协议,如果为0则自动选择合适的协议(推荐)
2. 绑定套接字
bind(socketSrc, (SOCKADDR*)&addsrc, sizeof(SOCKADDR));
第一个参数:一个未绑定的的套接字
第二个参数:通过一个SOCKADDR结构体将一个地址分配给套接字
第三个参数:第二个参数的大小长度
SOCKADDR结构体: struct sockaddr_in {
short sin_family;
u_short sin_port;
struct in_addr sin_addr;
char sin_zero[8];
};
第一个成员:sin_family地址族(这个参数不使用网络字节序列,其他参数都是网络字节序列)
第二个成员:sin_port指定要绑定的端口使用htons来转换成网络字节序列因为是无符号短整型
第三个成员:in_addr的结构体用来存放地址in_addr的结构如下
struct in_addr {
union {
struct S_un_b;
struct S_un_w;
u_long S_addr;
} S_un;
};
可以看出in_addr是一个包含一个联合体的结构体,联合体可以用来存放不同类型的数据但只存放一个数据,根据选择不同而不同,我们的程序中选择的是长整型的变量S_addr来存放一个地址需用htonl来转换成为网络字节序;
l htonl和htons区别是在于一个是将一个32位的主机字节序列转换成32位的TCP/IP的网络字节序一个则是16位
l inet_addr的用处是将一个点分制的IP地址字符串转换为一个合适的 in_addr的变量。
l inet_ntoa将一个网络地址转换为标准的点分式地址格式的字符串
3. 监听套接字:
listen(socketSrc, 5); //listen用于将一个已绑定但未连接的套接字对象设定成监听模式等 到一个即将到来的连接
第二个参数:表示等待连接的最大长度,如果参数被设置为SOMAXCONN将被设成一个最大的可能值
4. 接受连接:
在一个被设置为监听的套接字上允许一个连接,并返回一个已连接的新的套接字
SOCKET socketconn = accept(socketSrc, (SOCKADDR*)&addclient, &len);
第一个参数:一个被设置为监听状态的套接字;
第二个参数:一个SOCKADDR结构体用于保存请求连接的实体的地址,根据地址族的不同所创建的结构体不一样
第三个参数:存储地址的长度,此参数在调用accept函数前必须初始化,否则会导致调用失败
5. 完成以上工作后通过recv和send函数来接收和发送数据
recv(socketconn, recvbuf, 100, 0);
第一个参数是一个已连接的套接字
第二个参数是用来存储接收的数据的缓冲区地址
第三个参数表示缓冲区的大小
第四个参数指示接收的模式此处设为0
客户端的编写
6. 首先也是创建套接字
7. 然后在建立连接
connect(sockclient, (SOCKADDR*)&addsrc, sizeof(SOCKADDR));
第二个参数是要连接的地址,第三个参数则是地址的大小
UDP编程部分在简单的多线程聊天室的编写中详细说明
他是基于无连接的协议
所以编写服务器端时只要绑定了套接字后就可以开始传送和接受数据,而客户端则只需创建套接字就可以开始传送和接收
同过 recvfrom和sendto函数来操作
使用closesocket(m_socket);关闭一个套接字,使用WSACleanup();来释放套接字库
希望对你有帮助呵呵 这是在VC下的

网站数据信息

"sendto函数,udpsendto返回码是128"浏览人数已经达到21次,如你需要查询该站的相关权重信息,可以点击进入"Chinaz数据" 查询。更多网站价值评估因素如:sendto函数,udpsendto返回码是128的访问速度、搜索引擎收录以及索引量、用户体验等。 要评估一个站的价值,最主要还是需要根据您自身的需求,如网站IP、PV、跳出率等!