我的一段程序只能发UDP包,不能发tcp包?
下面是其中的一段。此段发送一个udp包,可以成功。
DWORD WINAPI tcp()
{
char buf[100];
SOCKADDR_IN ssin;
LPHOSTENT hostent = NULL;
IN_ADDR iaddr;
SOCKET usock;
usock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); (1)
memset(&ssin, 0, sizeof(ssin));
ssin.sin_family = AF_INET;
hostent = gethostbyname("x.x.x.x");
ssin.sin_addr = *((LPIN_ADDR)*hostent->h_addr_list);
ssin.sin_port = htons(23);
sendto(usock, buf, 100, 0, (LPSOCKADDR)&ssin, sizeof(ssin));
xuf<<GetLastError()<<endl;
}
可要是把(1)行改成
usock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
就会得到10057,即无法连接socket错误,请问怎么回事?谢谢
[解决办法]
10057的原因如下:
由于套接字没有连接并且(当使用一个 sendto 调用发送数据报套接字时)没有提供地址,发送或接收数据的请求没有被接受。
感觉不是这个语句得到的错误 usock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
是不是这个语句得到的10057? sendto(usock, buf, 100, 0, (LPSOCKADDR)&ssin, sizeof(ssin));
由于没有建立TCP连接而无法发送。
[解决办法]
TCP 要用send,不是sendto,而且用之前要用conect链接目标
[解决办法]
- C/C++ code
SOCKADDR_IN ssin; SOCKET usock= socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );if( usock !=INVALID_SOCKET){ memset(&ssin, 0, sizeof(ssin)); ssin.sin_family = AF_INET; hostent = gethostbyname("x.x.x.x"); ssin.sin_addr = *((LPIN_ADDR)*hostent->h_addr_list); ssin.sin_port = htons(23); if( connect( usock, (SOCKADDR*)&ssin, sizeof( ssin) ) != SOCKET_ERROR ) { send(usock, buf, 100, 0 ); }}
[解决办法]
没有进行3路握手,tcp没有确定目标ip地址,无法通信。
理论上,可以对udp进行connect,之后用send函数。
但是,对tcp,必须是connect或是accept之后才能使用。
(这时候,socket是一个流,用send,write都可以的)