[英]TCP connection not established in windows - c++
使用Windows 10,Visual Studio 2017。
我已經閱讀了很多示例,並花了無數時間在此上,並且無法使它正常工作。 我希望程序根據某些變量充當客戶端和服務器(以在兩台不同的計算機上復制此塊)。
bool IPTunnel::runBlock(void)
{
int ready = inputSignals[0]->ready(); //int ready2 = inputTCPConnetion[0]->ready();
WSADATA wsaData;
int iResult;
iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (iResult != 0) {
printf("WSAStartup failed: %d\n", iResult);
return 1;
}
//server
SOCKET sockfd, newsockfd;
int portno;
socklen_t clilen;
char buffer[256];
struct sockaddr_in serv_addr, cli_addr;
int n;
char sendbuf[15] = "this is a test";
char recvbuf[256];
int resul;
// create a socket(int domain, int type, int protocol)
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0)
printf("\n ERROR opening socket");
// clear address structure
bzero((char *)&serv_addr, sizeof(serv_addr));
portno = 5500;
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;//inet_addr("127.0.0.1");
serv_addr.sin_port = htons(portno);
//if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0)
bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr));
// printf("\n ERROR on binding");
listen(sockfd, 5);
clilen = sizeof(cli_addr);
newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
if (newsockfd < 0)
printf("ERROR on accept");
printf("server: got connection from %s port %d\n",inet_ntop(serv_addr.sin_family,
&serv_addr.sin_addr.s_addr, buffer, clilen), portno);
//client
int socketId = socket(PF_INET, SOCK_STREAM, 0);
struct sockaddr_in serverAddr;
socklen_t addrSize = sizeof(serverAddr);
bzero((char*)&serverAddr, sizeof(serverAddr));
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(8080);
serverAddr.sin_addr.s_addr = INADDR_ANY;
connect(socketId, (struct sockaddr*)&serverAddr, addrSize);
resul = send(socketId, sendbuf, (int)strlen(sendbuf), 0);
if (resul == SOCKET_ERROR) {
printf("send failed: %d\n", WSAGetLastError());
closesocket(newsockfd);
WSACleanup();
return 1;
}
printf("Bytes Sent: %ld\n", resul);
do{
resul = recv(newsockfd, recvbuf, 256, 0);
if (resul > 0)
printf("Bytes received: %d\n", resul);
else if (resul == 0)
printf("Connection closed\n");
else
printf("recv failed: %d\n", WSAGetLastError());
} while (resul > 0);
bzero(buffer, 256);
resul = recv(socketId, buffer, 256, 0);
fprintf(stdout, "%s %s\n", "Response from server", resul);
while (true) { Sleep(1000); }
return 0;
}
這是輸出:
服務器:從0.0.0.0端口5500獲得連接
連接失敗:10038
(我檢查了此錯誤10038 https://docs.microsoft.com/zh-cn/windows/desktop/winsock/windows-sockets-error-codes-2 )
我究竟做錯了什么? 提前致謝。
resul = send(socketId, sendbuf, (int)strlen(sendbuf), 0);
在send
使用strlen
是個壞主意,您確定您的字符串以null終止並且您不希望發送null嗎?
int socketId = socket(PF_INET, SOCK_STREAM, 0);
應該是SOCKET
,而不是int
。
connect(socketId, (struct sockaddr*)&serverAddr, addrSize);
您檢查返回值了嗎? 在監聽另一個端口的同時連接到8080端口?
考慮改用WSAConnectByName ,這比填充sockaddrs(兼容IPv6)要容易得多。
另外,您需要線程。 服務器必須調用accept(),這將阻止。 recv()/ send()是阻塞函數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.