socket 收发问题

glassegg 2005-05-17 10:56:19
有一个socket收信,然后再给其他端口发信,可以实现吧?我写了程序,可是受到数据后,送信总是返回-1,不知道为什么,大家帮忙看看。
//收信
SOCKET sock;
WSADATA wsaData;
SOCKADDR_IN sockaddr;

WORD wVersionRequested;

int result;
wVersionRequested = MAKEWORD(2,0);

if((result = WSAStartup(wVersionRequested,&wsaData))!=0)
{
Application->MessageBoxA("Socket Initial Error","Error",MB_OK);
WSACleanup();
return;
}

memset(&sockaddr,0,sizeof(sockaddr));
sockaddr.sin_port=htons(5000);
sockaddr.sin_family=AF_INET;
sockaddr.sin_addr.S_un.S_addr=htonl(INADDR_ANY);

sock = socket(AF_INET,SOCK_DGRAM,0);
if(sock == INVALID_SOCKET)
{
Application->MessageBoxA("Socket Open Error","Error",MB_OK);
WSACleanup();
return;
}
//socket邦定5000断口
result = bind(sock,(LPSOCKADDR)&sockaddr,sizeof(sockaddr));
if(result == SOCKET_ERROR)
{
Application->MessageBoxA("Bind Error","Error",MB_OK);
WSACleanup();
return;
}
result = recvfrom(sock,rbuf,SNDRCVDATALEN,0,NULL,NULL);
if(result == SOCKET_ERROR)
{
Application->MessageBoxA("Error","Error",MB_OK);
WSACleanup();
return;
}

int portnumber=5;
long cport[10] =
{40001,40002,40003,40004,40005};
//送信
SOCKADDR_IN sockaddr1;
for(int i=1; i <= portnumber; i++)
{
memset(&sockaddr1,0,sizeof(sockaddr1));
sockaddr1.sin_port=htons(cport[i-1]);
sockaddr1.sin_family=AF_INET;
sockaddr1.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
int re=sendto(sock , rbuf , strlen(rbuf),0,(struct sockaddr FAR *) &sockaddr1 ,sizeof(sockaddr1));
if(re==SOCKET_ERROR)
{
break;
}
}
...全文
294 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2005-08-02
  • 打赏
  • 举报
回复
学习
zyyoung 2005-05-28
  • 打赏
  • 举报
回复
在发送完一个数据报后,sleep(900),然后在发送下一个,试试!
FengSC 2005-05-18
  • 打赏
  • 举报
回复
10055是说明没有足够的BUFFER空间了,有可能是你发信息太快了,处理办法有两个,1:加大socket发送缓冲。2:减慢数据发送速度。
glassegg 2005-05-17
  • 打赏
  • 举报
回复
那我现在这个代码为什么不能实现?
拜托各位高人指点一下。
wangxiangsjz 2005-05-17
  • 打赏
  • 举报
回复
可以向本机的端口发送数据
glassegg 2005-05-17
  • 打赏
  • 举报
回复
我扑捉到wsagetlasterror返回的错误编号是10049,是什么错误啊?
glassegg 2005-05-17
  • 打赏
  • 举报
回复
To lidawen(Darwin)

为什么发送需要用另一个socket,不能用同一个发吗?
还有,我照你说的改了,为什么还是返回-1?
是不是,不能向本机的端口发送信息?
lidawen 2005-05-17
  • 打赏
  • 举报
回复
發送應該使用另外一個socket發.
定義SOCKET sock2;

int portnumber=5;
long cport[10] =
{40001,40002,40003,40004,40005};
//送信
SOCKADDR_IN sockaddr1;
sock2 = socket ( AF_INET, SOCK_DGRAM, 0 );

for(int i=1; i <= portnumber; i++)
{
memset(&sockaddr1,0,sizeof(sockaddr1));
sockaddr1.sin_port=htons(cport[i-1]);
sockaddr1.sin_family=AF_INET;
sockaddr1.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
int re=sendto(sock2 , rbuf , strlen(rbuf),0,(struct sockaddr FAR *) &sockaddr1 ,sizeof(sockaddr1));
if(re==SOCKET_ERROR)
{
break;
}
}
glassegg 2005-05-17
  • 打赏
  • 举报
回复
大家可别丢下我啊。。

现在就是这个10055比较头疼,因该怎样解决啊?
glassegg 2005-05-17
  • 打赏
  • 举报
回复
旧纪录的哪些东东没有释放?怎么释放啊?需要在程序那里加处理?
请告知~
这种做法可取吗?
我在考虑,是不是再加一个线程,专门负责向外发送数据?
这样就不会延缓接收数据的速度?
大家快来踊跃发言啊。。
happyct 2005-05-17
  • 打赏
  • 举报
回复
你的接收缓冲满了,新的数据进不来。

你每接收一个数据,就得回复portnumber个信息,请确认你的某些资源是否释放完毕!每回复一次就记录一点不释放,就会导致“已经可以用了,8过就是当大量向多个端口发数据,又会跳出10055错误,这又是怎么回事?“
glassegg 2005-05-17
  • 打赏
  • 举报
回复
这个错误会不会是因为对方给我送信的速度过快引起的?还是,本机向其他端口送信buffer不够引起?
不知道。。。。
高手解释一下撒
glassegg 2005-05-17
  • 打赏
  • 举报
回复
已经可以用了,8过就是当大量向多个端口发数据,又会跳出10055错误,这又是怎么回事?

1,317

社区成员

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

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