Iveは、クライアントアプリケーションの種類に関係なく画面にエコーするサーバープログラムを作成してコンパイルします。コードは次のとおりです。winsockサーバーのトラブルシューティング
/*Server */
#define _WIN32_WINNT 0x501
#include <iostream>
#include <windows.h>
#include <winsock2.h>
#include <ws2tcpip.h>
using namespace std;
const int winsock_version = 2;
#define PORT "3490"
#define MAX_NUM_CONNECTIONS 10
int main(void){
WSADATA wsadata;
if (WSAStartup(MAKEWORD(winsock_version,0),&wsadata) == 0){
cout<<"-WSAStartup Initialized." << endl;
struct addrinfo hints,*res;
int sock_fd;
memset(&hints,0,sizeof hints);
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
hints.ai_flags = AI_PASSIVE;
if (getaddrinfo(NULL,PORT,&hints,&res) != 0){
cout<<"-Call to getaddress was unsucceful." << endl;
}
if((sock_fd = socket(res->ai_family,res->ai_socktype,res->ai_protocol)) == -1){
cout<<"-Unable to Create socket." << endl;
}
if ((bind(sock_fd, res->ai_addr, res->ai_addrlen)) != -1){
cout<<"-binding successful." << endl;
}
if ((listen(sock_fd,MAX_NUM_CONNECTIONS)) != -1){
cout<<"-Listening for incoming connections." << endl;
}
//-------------------------------------------------------------
struct sockaddr_storage incming_info;
socklen_t sin_size;
sin_size = sizeof incming_info;
int new_fd;
new_fd = accept(sock_fd, (struct sockaddr*)&incming_info,&sin_size);
if (new_fd == -1){
cout<<"-Accepting error." << endl;
}
if(new_fd == INVALID_SOCKET){
cout<<"-INVALID SOCKET ERROR." << endl;
}
closesocket(new_fd);
//-------------------------------------------------------------
cout<<"Connected?" << endl;
while(true){
int ret_val;
char buffer[128];
ret_val = recv(new_fd,buffer,sizeof(buffer),0);
if(ret_val == -1){
cout<<"Receiving Error." << endl;
break;
}else if(ret_val == 0){
cout<<"Connection has been closed!." << endl;
break;
}else{
cout<<"---Server Echoeing what was recieved from client---" << endl;
cout<<"Server: " << buffer << endl;
}
closesocket(new_fd);
}
cout<<"-Closing connection" << endl;
}else{
cout<<"-WSAStartup Initialization failed." << endl;
if(WSACleanup()!=0){
cout<<"-WSACleanup Successful." << endl;
}else{
cout<<"-WSACleanup Failed." << endl;
}
}
return 0;
}
私はパテを使用して、サーバが死んで出力し、ポート3490でlocalhostに接続しようとすると、全部が「エラーを受け取った」しかし、コンパイルし、実行します。この問題の原因は何ですか?
なぜWSAGetLastError()を呼び出して見つけてください... –