程序如下
#include "stdafx.h"
#include <iostream>
#include  "Winsock2.h"
#pragma comment(lib,"Ws2_32.lib")#define MAX_BUFFER 1024*1024
int _tmain(int argc, _TCHAR* argv[])
{
if (argc!=3) 
{
std::cout<<"input like send 192.168.168.18 1000";
return 0;
} //char szRemoteIP[20]; //strcpy(szRemoteIP,argv[1]); int iSendCount=atoi(argv[2]); WSADATA wsadata;
WSAStartup(0x0202,&wsadata);
SOCKADDR_IN addrto,addrlocal; addrlocal.sin_family=AF_INET;
addrlocal.sin_port=htons(9100);
addrlocal.sin_addr.S_un.S_addr=htonl(INADDR_ANY); addrto.sin_family=AF_INET;
addrto.sin_port=htons(9101);
addrto.sin_addr.S_un.S_addr=inet_addr(argv[1]); SOCKET sockbind=socket(AF_INET,SOCK_STREAM,IPPROTO_IP );
if(sockbind==INVALID_SOCKET)
{
std::cout<<"socket error,"<<GetLastError()<<std::endl;
return 0;
}
else
{
std::cout<<"socket value:"<<sockbind<<std::endl;
}
/*if(SOCKET_ERROR==bind(sockbind,(sockaddr*)&addrlocal,sizeof(sockaddr)))
{
std::cout<<"bind error,"<<GetLastError()<<std::endl;
return 0;
}
   */
int iconnect=connect(sockbind,(sockaddr*)&addrto,sizeof(sockaddr));
if(SOCKET_ERROR==iconnect)
{
std::cout<<"connect error:"<<WSAGetLastError();
WSACleanup();
return 0;
}
char *szsend=new char[/*MAX_BUFFER*/iSendCount];
    szsend[/*MAX_BUFFER*/iSendCount-1]='\0';
    memset(szsend,'A',/*MAX_BUFFER*/iSendCount-1);
int isendlen=send(sockbind,szsend,/*MAX_BUFFER*/iSendCount,0);
if(isendlen<=0)
{
std::cout<<"send error:"<<WSAGetLastError();
return 0;
}
else std::cout<<"send count:"<<isendlen<<std::endl;    Sleep(2000);
if(SOCKET_ERROR ==closesocket(sockbind))
{
std::cout<<"close socket error"<<GetLastError()<<std::endl;
}
if(SOCKET_ERROR ==WSACleanup())
{
std::cout<<"wsacleanup error"<<GetLastError()<<std::endl;
}
return 0;
}就是一个小例子。想测试一下 tcp一次发多少包合适。
但是使用bind的话 发送完以一次成功。如果发送第二次在connect的时候就会提示10048错误。使用netstat查看的话 端口已经被占用还未释放。
请问使用什么函数可以立即释放端口的?
不使用bind的话,操作系统会自动分配一个发送端口所以基本不存在上面的问题。
另外本机测试一般超过上十万字节的包。服务器就可能收不全了。
大家做tcp或者udp传输的时候一般每次传多少个字节合适?这个跟mtu有没有关系?每次传的包是否要小于mtu的值?

解决方案 »

  1.   

    linux下是setsockopt(s,SOL_SOCKET ,SO_REUSEADDR,(const char*)&bReuseaddr,sizeof(BOOL));
    setsockopt实现,VC下应该也有的.
      

  2.   

    我也遇到了同样的问题, 明明closesocket , 但端口还被占用,真郁闷
      

  3.   

    if(SOCKET_ERROR ==closesocket(sockbind))
        {
            std::cout<<"close socket error"<<GetLastError()<<std::endl;
        }
    在这后面加上sockbind = INVALID_SOCKET;
    试下tcp一般4K左右的包比较合适吧
      

  4.   

    用于connect的socket不要绑定地址。