关于send()与recv()

ZongShengLee 2010-04-28 11:58:10
1、send函数没有目标ip地址,那么它将buffer内容发送到哪里?
2、同样,recv函数也没ip地址来标识它要从哪获取数据

个人想法:send和recv都有socket参数,来指明在哪个socket上进行收发包,如果send和recv都用同一个socket句柄作为参数,那么容易理解send的目标地址以及recv的源地址。但是,客户端朝服务器发包,显然客户端send函数的socket与服务器端的socket是两码事。我该怎么理解?

...全文
318 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
windows_star 2010-04-28
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 zongshenglee 的回复:]
引用 1 楼 windows_star 的回复:
send怎么没有IP地址?
recv怎么没有IP地址?

那你sockaddr_in 这个结构体你弄哪去了?


send()函数原型里边没有sockaddr_in参数

int send(
__in SOCKET s,
__in const char *buf,
__in int len,
__in in……
[/Quote]
sorry 搞错了。

你发送数据的那个socket是connect来的吧。
ZongShengLee 2010-04-28
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 windows_star 的回复:]
引用 2 楼 zongshenglee 的回复:
引用楼主 zongshenglee 的回复:
1、send函数没有目标ip地址,那么它将buffer内容发送到哪里?
2、同样,recv函数也没ip地址来标识它要从哪获取数据

个人想法:send和recv都有socket参数,来指明在哪个socket上进行收发包,如果send和recv都用同一个socket句柄作为参数,那么容易理解se……
[/Quote]

没少参数啊!
ZongShengLee 2010-04-28
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 windows_star 的回复:]
send怎么没有IP地址?
recv怎么没有IP地址?

那你sockaddr_in 这个结构体你弄哪去了?
[/Quote]

send()函数原型里边没有sockaddr_in参数

int send(
__in SOCKET s,
__in const char *buf,
__in int len,
__in int flags
);
windows_star 2010-04-28
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 zongshenglee 的回复:]
引用楼主 zongshenglee 的回复:
1、send函数没有目标ip地址,那么它将buffer内容发送到哪里?
2、同样,recv函数也没ip地址来标识它要从哪获取数据

个人想法:send和recv都有socket参数,来指明在哪个socket上进行收发包,如果send和recv都用同一个socket句柄作为参数,那么容易理解send的目标地址以及recv的源地址。但是,客户端朝服……
[/Quote]

哥哥你少了个参数吧?
ZongShengLee 2010-04-28
  • 打赏
  • 举报
回复
[Quote=引用楼主 zongshenglee 的回复:]
1、send函数没有目标ip地址,那么它将buffer内容发送到哪里?
2、同样,recv函数也没ip地址来标识它要从哪获取数据

个人想法:send和recv都有socket参数,来指明在哪个socket上进行收发包,如果send和recv都用同一个socket句柄作为参数,那么容易理解send的目标地址以及recv的源地址。但是,客户端朝服务器发包,显然客户端send函数的socket与……
[/Quote]

int send(
__in SOCKET s,
__in const char *buf,
__in int len,
__in int flags
);

windows_star 2010-04-28
  • 打赏
  • 举报
回复
send怎么没有IP地址?
recv怎么没有IP地址?

那你sockaddr_in 这个结构体你弄哪去了?
bragi523 2010-04-28
  • 打赏
  • 举报
回复
你要找一本书,系统的看一下网络的知识,要不然就拿一段例程看一下,
deletex 2010-04-28
  • 打赏
  • 举报
回复
tcp
服务端accept的时候,返回的socket,已经和客户端的ip,port关联了
客户端connect的时候,指定了ip,port,也有关联
bragi523 2010-04-28
  • 打赏
  • 举报
回复
当然不是同一个socket

socket是应用程序和协议的接口

client和server两个应用程序怎么可能是同一个socket

两个socket和不代表两条连接
byxdaz 2010-04-28
  • 打赏
  • 举报
回复
SOCKET是unsigned long,是唯一的.SOCKET套接字其实是与IP关联的,正如通过getsockname/getpeername可以得到IP地址信息.
ZongShengLee 2010-04-28
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 bragi523 的回复:]
引用 12 楼 zongshenglee 的回复:
1、SOCKET是unsigned long,它本身不能存储ip地址、端口号等,它是不是关联一个数据结构,其中存储了相关信息?

2、客户端:
connect(SOCKET socket, sockaddr * name, int namelen);
如果连接成功,则将socket与 name对应起来,这种对应通过将name指向的结构中……
[/Quote]
int PASCAL FAR connect ( IN SOCKET s, IN const struct sockaddr FAR *name, IN int namelen)向地址为name的服务器发起连接请求;
SOCKET PASCAL FAR accept ( IN SOCKET s, OUT struct sockaddr FAR *addr, IN OUT int FAR *addrlen)接受客户端连接,将客户端地址保存到addr,所以主机知道了客户端地址;
一个socket接口,连着连个端,那么以socket为通道,可以进行数据IO;但是connect和accept的s不是同一个socket,怎么理解?
bragi523 2010-04-28
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 zongshenglee 的回复:]
1、SOCKET是unsigned long,它本身不能存储ip地址、端口号等,它是不是关联一个数据结构,其中存储了相关信息?

2、客户端:
connect(SOCKET socket, sockaddr * name, int namelen);
如果连接成功,则将socket与 name对应起来,这种对应通过将name指向的结构中的地址、端口信息复制到s所关联的数据结构中?
3、服……
[/Quote]

你的理解偏差很大

TCP上层对每个包都做了封装,对于服务器,他知道是谁给它发的包,所以也就知道client的地址
ZongShengLee 2010-04-28
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 bragi523 的回复:]
TCP中socket已经连接,相当于开了一条通道
对应本机的一个端口和对端的一个端口
发送就是从这条通道发过去
send的只有这一条通道

至于socket本身,它就是一个应用程序和TCP协议的接口
[/Quote]

学习了
bragi523 2010-04-28
  • 打赏
  • 举报
回复
TCP中socket已经连接,相当于开了一条通道
对应本机的一个端口和对端的一个端口
发送就是从这条通道发过去
send的只有这一条通道

至于socket本身,它就是一个应用程序和TCP协议的接口
ZongShengLee 2010-04-28
  • 打赏
  • 举报
回复
1、SOCKET是unsigned long,它本身不能存储ip地址、端口号等,它是不是关联一个数据结构,其中存储了相关信息?

2、客户端:
connect(SOCKET socket, sockaddr * name, int namelen);
如果连接成功,则将socket与 name对应起来,这种对应通过将name指向的结构中的地址、端口信息复制到s所关联的数据结构中?
3、服务器端:
服务器端某socket绑定了本地的地址信息,置其于监听状态之后,通过accept函数来等待客户端连接。accept原型:SOCKET PASCAL FAR accept ( IN SOCKET s, OUT struct sockaddr FAR *addr, IN OUT int FAR *addrlen)
如果客户端connect成功,则addr被填充,然后将addr指向的结构体中的地址信息,复制到s关联的结构体中?

现在有个问题,如果我上边的理解正确,那么必须要让connect中的socket与accetp中的socket对应于同一个存储地址信息的结构,才能进行接下来的send与recv。



以上是我的理解,刚学winsock编程,有什么偏差或者错误还望各位有经验的提出,我好弥补。
dns007 2010-04-28
  • 打赏
  • 举报
回复

SOCKET SocketClient;
SocketClient=socket(AF_INET,SOCK_STREAM,0);
sockaddr_in clientService;
clientService.sin_addr.S_un.S_addr=inet_addr( serverip );
clientService.sin_family=AF_INET;
clientService.sin_port=htons(atoi(serverport));

在建立socket 到时候 不是都有指定类型和绑定IP及端口到,如上

尹成 2010-04-28
  • 打赏
  • 举报
回复
send只是将内容拷贝到socket的sendbuffer中,只要拷贝成功,就会成功。
这也是唯一一个不判断socket执行是否成功的函数。其它的socket函数首先
都会判断send是否成功,再执行,否则返回SOCKET_ERROR.
enter333 2010-04-28
  • 打赏
  • 举报
回复
可以对你的socket进行getsocketname。里面就包含了IP地址,端口等信息。
Sou2012 2010-04-28
  • 打赏
  • 举报
回复
SOCKADDR 就是这个啊
shenyi0106 2010-04-28
  • 打赏
  • 举报
回复
你要的那个IP在你的socket句柄中

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧