关于ServerSocket的问题

alen35532119 2006-10-13 11:44:53
请问如何在未建立连接的情况下,用ServerSocket向客户端发数据包?已经知道客户端的IP地址和端口号了.
...全文
232 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
quiton 2006-10-28
  • 打赏
  • 举报
回复
客户端:
#include <Winsock2.h>
#include <stdio.h>

void main()
{
//加载套接字库
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 2, 2 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
return;
}
if ( LOBYTE( wsaData.wVersion ) != 2 ||
HIBYTE( wsaData.wVersion ) != 2 ) {
WSACleanup( );
return;
}

//创建套接字
SOCKET sockClient = socket(AF_INET,SOCK_STREAM,0);

SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
addrSrv.sin_family = AF_INET;
addrSrv.sin_port=htons(6000);

//向服务器发出连接请求
connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));

//接收数据
char recvBuf[100];
recv(sockClient,recvBuf,100,0);
printf("%s\n",recvBuf);

//发送数据
send(sockClient,"This is lisi",strlen("This is lisi")+1,0);

//关闭套接字
closesocket(sockClient);
WSACleanup();
}
quiton 2006-10-28
  • 打赏
  • 举报
回复
服务器端:
#include <Winsock2.h>
#include <stdio.h>

void main()
{
//加载套接字库
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 2, 2 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
return;
}
if ( LOBYTE( wsaData.wVersion ) != 2 ||
HIBYTE( wsaData.wVersion ) != 2 ) {
WSACleanup( );
return;
}

//创建用于监听的套接字

SOCKET sockSrv = socket(AF_INET,SOCK_STREAM,0);

SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(6000);

//绑定套接字
bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));

//将套接字设为监听模式,准备接受客户端请求
printf("-------\n");
printf("正在监听");
listen(sockSrv,5);

SOCKADDR_IN addrClient;
int len = sizeof(SOCKADDR);

while(1)
{
//等待客户请求的到来
SOCKET sockConn = accept(sockSrv,(SOCKADDR*)&addrClient,&len);
char sendBuf[100];
sprintf(sendBuf,"Weclome %s to http://www.fudan.edu.cn",inet_ntoa(addrClient.sin_addr));

printf("%s\n",sendBuf);
//printf("111");

//发送数据
send(sockConn,sendBuf,strlen(sendBuf)+1,0);

//接收数据
char recvBuf[100];
recv(sockConn,recvBuf,100,0);

//打印接受到的数据
printf("%s\n",recvBuf);

//关闭套接字

closesocket(sockConn);
}
}
wz 2006-10-28
  • 打赏
  • 举报
回复
mark
Andrionda 2006-10-16
  • 打赏
  • 举报
回复

CLS_Socket::CLS_Socket()
{
m_iSocket=-1;
m_iStatus=SS_UNUSED;
m_iSocketError=0;
#ifdef _WIN32
WSADATA wsaData;
if(!g_iSockCount)
{
if (WSAStartup(0x202, &wsaData) == SOCKET_ERROR)
WSACleanup();
}
g_iSockCount++;
#endif
}
//发送数据
int CLS_Socket::SendData(void *pData, int iMaxLen)
{
int iRet, iLen, i;
char *p;

i=0;
iLen=0;
p=(char *)pData;
while(iLen<iMaxLen)
{
iRet=send(m_iSocket, p, iMaxLen-iLen, 0);
if(iRet<0)
{
#ifdef _WIN32
m_iSocketError=GetLastError();
if(m_iSocketError==WSAEWOULDBLOCK)
iRet=0;
else
{
CloseSocket();
return -1;
}
#else
m_iSocketError=errno;
if(m_iSocketError==EWOULDBLOCK||m_iSocketError==EINTR)
iRet=0;
else
{
CloseSocket();
return -1;
}
#endif
}

m_iSocketError=0;
iLen+=iRet;
if(iRet==0)
{
i++;
if(i==MAX_TRY_SOCK)
{
CloseSocket();
return -2;
}
#ifdef _WIN32
Sleep(SOCK_SLEEP);
#else
usleep(SOCK_SLEEP);
#endif
}
p+=iRet;
}

return iLen;
}


楼主参考一下
铖邑 2006-10-13
  • 打赏
  • 举报
回复
一定要先建立连接之后才能发送数据。ServerSocket不支持服务器主动连接客户端。可以用socket api编程实现。
alen35532119 2006-10-13
  • 打赏
  • 举报
回复
假如我的IP地址是192.168.1.1,端口是80,发送的数据是BUF,长度是LEN,该怎么用SOCKET API?
do2008 2006-10-13
  • 打赏
  • 举报
回复
原则:TCP在没有建立连接的情况下,是不能发送数据包的.

你说>>已经知道客户端的IP地址和端口号了.

那就向这个ip、端口连接,连接成功后,再发送数据
alen35532119 2006-10-13
  • 打赏
  • 举报
回复
那用socket api怎么写呢?

1,317

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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