windows下 bind error -- udp
(2017-04-24 21:03:56)| 分类: windowsVS编程及使用 |
建议几个网站 我也顺便黏贴下来:
1.UDP
socket编程:
UDP(用户数据报协议)是一个无连接,不可靠的数据传输,其特点是简单,快捷。相比与TCP,UDP不需要建立连接(不需connect、accept函数),数据发送接收之后,不需要终止连接。基于UDP的程序,避免了TCP运行的开销,在效率与速度上具有更好的表现。
UDP是无连接的,可能会有数据的丢失,延迟,这些需要应用程序自己处理。
2.UDP基本函数:
SOCKET socket (int
af, int type, int protocol);
第一个参数af:
表示族地址,网络编程一般使用AF_INET宏。
第二个参数type:
表示连接类型,TCP可选面向连接SOCK_STREAM,UDP数据报SOCK_DGRAM。
第三个参数protocol:
表示协议,在使用AF_INET族地址UDP连接,设为IPPROTO_UDP。
int bind(SOCKET s, const struct sockaddr
*saddr,int namelen);
第一个参数:
需要绑定的socket。
第二个参数: 对应AF_INET,使用struct
sockaddr_in包含协议,IP,端口等信息。( 这个参数和百度百科有不同,为什么?)
第三个参数: 对应AF_INET,使用struct
sockaddr_in结构大小。
该函数将socket与协议,IP地址,Port端口号绑定起来,相对于给socket“命名”唯一的标识,这样其他的进程就可以通过这个标识找到这个socket。
int sendto(SOCKET s, const char
*buf, int
len,
int flags, const struct sockaddr
*to, int tolen );
第一个参数:
socket为对方的socket。
第二个参数:
发送数据的缓冲区。
第三个参数:
数据缓冲区大小。
第四个参数:
紧急状态,一般这为0。
第五个参数:
可选,对应AF_INET,对方IP,端口等socket地址标识sockaddr_in。
第六个参数:
可选,对应AF_INET,使用sockaddr_in结构大小。
该函数用于UDP发送数据。
int recvfrom(SOCKET s, char *buf, int
len,
int flags,
struct sockaddr *from, int
*fromlen );
第一个参数:
socket为对方的socket。
第二个参数:
接收数据的缓冲区。
第三个参数:
数据缓冲区大小。
第四个参数:
紧急状态,一般这为0。
第五个参数:
可选,对应AF_INET,返回对方IP,端口等socket地址标识sockaddr_in。
第六个参数:
可选,对应AF_INET,使用sockaddr_in结构大小。
该函数用于UDP接收数据。
int
bind(SOCKET s, const struct sockaddr
*saddr,int namelen);
第一个参数:
需要绑定的socket。
第二个参数:
对应AF_INET,使用struct
sockaddr_in包含协议,IP,端口等信息。
第三个参数:
对应AF_INET,使用struct
sockaddr_in结构大小。
该函数将socket与协议,IP,端口号绑定起来,相对于给socket“命名”唯一的标识,这样其他的进程就可以通过这个标识找到这个socket。
int
closesocket(SOCKET s);
参数为socket。
该函数用于关闭套接字。
在windows下的socket不是int类型的,
传递参数出现了问题,当做了int
扩展下知识:
重要部分如下:
在windows 环境下为:
#include "winsock.h"
int PASCAL FAR bind( SOCKET sockaddr, const struct sockaddr FAR*
my_addr,int addrlen);
在linux 环境下为:
#include "sys/types.h"
#include "sys/socket.h"
int bind( int sockfd , const struct sockaddr * my_addr, socklen_t
addrlen);
参考部分如下:
Winsock是
Windows下套接字标准。
创建socket:
绑定socket:
发送数据:
接收数据:
绑定socket:
关闭套接字:
我的问题以及原因:
当然在创建socket的时候也需要注意,
只不过我不是因为socket的原因导致监听失败.
主要讲的是setsocketopt()的使用

加载中…