socket编程中、accept()函数的第二个参数、如何获取?
server端怎么知道这个参数是什么?!(我知道是client端的地址,我想知道具体怎么个获取流程!求没废话)...
server端怎么知道这个参数是什么?!(我知道是client端的地址,我想知道具体怎么个获取流程!求没废话)
展开
3个回答
展开全部
accept()函数的第二个参数是请求连接的地址,所以等待连接队列中抽取的请求连接的电脑的地址。初始化为null即可。
函数原型:int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
参数
sockfd:套接字描述符,该套接口在listen()后监听连接。
addr:(可选)指针,指向一缓冲区,其中接收为通讯层所知的连接实体的地址。Addr参数的实际格式由套接口创建时所产生的地址族确定。
addrlen:(可选)指针,输入参数,配合addr一起使用,指向存有addr地址长度的整型数。
例子:
#ifndef UNICODE
#defineUNICODE
#endif
#include <winsock2.h>
#include <stdio.h>
#include <windows.h>
//NeedtolinkwithWs2_32.lib
#pragmacomment(lib,"Ws2_32.lib")
int wmain(void)
{
WSADATAwsaData ;
intiResult=WSAStartup(MAKEWORD(2,2),&wsaData);
if(iResult!=NO_ERROR)
{
wprintf(L "WSAStartupfailedwitherror:%ld\n",iResult);
return 1 ;
}
SOCKETListenSocket ;
ListenSocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(ListenSocket==INVALID_SOCKET)
{
wprintf(L "socketfailedwitherror:%ld\n",WSAGetLastError());
WSACleanup();
return 1 ;
}
sockaddr_inservice ;
service.sin_family=AF_INET ;
service.sin_addr.s_addr=inet_addr("127.0.0.1");
service.sin_port=htons(27015);
if(bind(ListenSocket,
(SOCKADDR*)&service,sizeof(service))==SOCKET_ERROR)
{
wprintf(L"bindfailedwitherror:%ld\n",WSAGetLastError());
closesocket(ListenSocket);
WSACleanup();
return 1 ;
}
if(listen(ListenSocket,1)==SOCKET_ERROR)
{
wprintf(L"listenfailedwitherror:%ld\n",WSAGetLastError());
closesocket(ListenSocket);
WSACleanup();
return 1 ;
}
SOCKETAcceptSocket ;
wprintf(L "Waitingforclienttoconnect...\n");
//Accepttheconnection.
AcceptSocket=accept(ListenSocket,NULL,NULL);
if(AcceptSocket==INVALID_SOCKET)
{
wprintf(L "acceptfailedwitherror:%ld\n",WSAGetLastError());
closesocket(ListenSocket);
WSACleanup();
return 1 ;
}
else
wprintf(L "Clientconnected.\n");
closesocket(ListenSocket);
WSACleanup();
return 0 ;
}
展开全部
int accept(int sockfd, struct sockaddr *clientaddr, socklen_t *addrlen);
第二个参数clientaddr是一个传出参数,accept()返回时传出客户端的地址和端口号。
获取流程:服务器调用accept()阻塞等待,处于监听端口状态,客户端调用connect()发出SYN段并阻塞等待服务器应答,服务器应答一个SYN—ACK段,客户端收到后从connect()返回,同时应答一个ACK段,服务器收到后从accept()返回。
此问答的过程中客户端会将自己的地址和端口号告诉给服务器,填充到clientaddr地址处。
第二个参数clientaddr是一个传出参数,accept()返回时传出客户端的地址和端口号。
获取流程:服务器调用accept()阻塞等待,处于监听端口状态,客户端调用connect()发出SYN段并阻塞等待服务器应答,服务器应答一个SYN—ACK段,客户端收到后从connect()返回,同时应答一个ACK段,服务器收到后从accept()返回。
此问答的过程中客户端会将自己的地址和端口号告诉给服务器,填充到clientaddr地址处。
追问
我感觉你说的比较有道理!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这个地址是自己设置的啊,表示监听什么地址发来的连接
sockaddr_in sclientAddr;
sclientAddr.sin_family = AF_INET;
sclientAddr.sin_addr.s_addr = inet_addr("1.1.1.1");
sclientAddr.sin_port = htons(270);
这样表示监听1.1.1:270地址发来的连接,
如果地址设置成为any:
sclientAddr.sin_addr.s_addr = INADDR_ANY;
sclientAddr.sin_port = htons(270);
则监听所有地址上,270端口发来的连接
sockaddr_in sclientAddr;
sclientAddr.sin_family = AF_INET;
sclientAddr.sin_addr.s_addr = inet_addr("1.1.1.1");
sclientAddr.sin_port = htons(270);
这样表示监听1.1.1:270地址发来的连接,
如果地址设置成为any:
sclientAddr.sin_addr.s_addr = INADDR_ANY;
sclientAddr.sin_port = htons(270);
则监听所有地址上,270端口发来的连接
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询