2010-11-22 20 views
1

申し訳ありません私は過去の記事で同じトピックに関連するスレッドを投稿していますが、別の問題にヒットしました。winsockクライアントとサーバーの通信

server.cpp

/*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; 
     } 
     //------------------------------------------------------------- 

     cout<<"Connected?" << endl; 
     char buffer[128]; 
     while(true){ 
      int ret_val; 

      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 if(ret_val > 0){ 
       cout<<"Server: " << buffer<< endl; 
      } 
     } 

     cout<<"-Closing connection" << endl; 
     closesocket(new_fd); 
    }else{ 
     cout<<"-WSAStartup Initialization failed." << endl; 
     if(WSACleanup()!=0){ 
      cout<<"-WSACleanup Successful." << endl; 
     }else{ 
      cout<<"-WSACleanup Failed." << endl; 
     } 
    } 
    return 0; 
} 

client.cpp

/*client*/ 
#define _WIN32_WINNT 0x501 
#include <iostream> 
#include <windows.h> 
#include <winsock2.h> 
#include <ws2tcpip.h> 
using namespace std; 

#define PORT "3490" 
#define SERVER "localhost" 
const int winsockVersion = 2; 


int main(void){ 

    WSADATA wsadata; 
    if ((WSAStartup(MAKEWORD(2,0),&wsadata)) == 0){ 
     cout<<"-WSAStartup Initialized." << endl; 

     struct addrinfo hints, *res; 
     int sockfd; 

     memset(&hints,0,sizeof hints); 
     hints.ai_family = AF_UNSPEC; 
     hints.ai_socktype = SOCK_STREAM; 

     if (getaddrinfo(SERVER,PORT,&hints,&res) != 0){ 
      cout<<"-getaddrinfo unsuccessful." << endl; 
     } 

     if ((sockfd = socket(res->ai_family,res->ai_socktype,res->ai_protocol)) == -1){ 
      cout<<"-Unable to create socket." << endl; 
     } 

     if ((connect(sockfd,res->ai_addr,res->ai_addrlen)) != -1){ 
      cout<<"-Connection Established." << endl; 
     } 

     cout<<"-Client connecting to: " << res->ai_addr << endl; 

     while(true){ 
      char text_buff[128]; 
      cout<<"Enter text: "; 
      cin>>text_buff; 
      if((send(sockfd,text_buff,sizeof(text_buff),0)) != -1){ 
       cout<<"-text_buff sent!." << endl; 
       break; 
      } 
     closesocket(sockfd); 

     } 

    }else{ 
     cout<<"-WSAStartup Initialization failed." << endl; 
     if(WSACleanup()!=0){ 
      cout<<"-WSACleanup Successful." << endl; 
     }else{ 
      cout<<"-WSACleanup Failed." << endl; 
     } 
    } 

    return 0; 
} 

(何らかの理由で文を送っカント)私は、サーバーとクライアントの罰金を実行することができますが、私は1つの単語だけを送信することができますから、サーバコンソールでプリントアウトされるが、サーバコンソールにプリントアウトされると直ちに「受信エラー」を出力して終了するクライアント。

答えて

0

2つの問題
1. cin>>text_buff;は最初のスペースまで読み取ります。あなたはstd :: stringを使うことができます。
sizeof(text_buff)の代わりにstrlen(text_buff) + 1を使用してください。
のstd ::文字列を使用している場合は、[はいうーん

string line; 
send(sockfd, line.c_str(),line.length()+1,0) 
+0

ありがとうございます。 – silent

1

send()への1回の呼び出しで十分であるとは思いません(recv()でも同じです)。すべてのデータが送受信されるまで、データをループする必要があります。

また、常に128文字を送信したくない場合は、必要な長さだけを送信してください(メッセージにターミネータまたはプレフィックス長のいずれかを付けてください)。

+0

を試してみてくださいしかし、私はこれを行うことができます前に、なぜ接続が崩壊しています。 – silent

0

入力をchar text_buffをstd :: stringとstd :: getlineで置き換えてみてください。

while(true) 
{ 
    std::string line; 
    std::cout << "Enter text: "; 
    std::getline(cin, line); 
    if(send(sockfd, text_buff.c_str(), text_buff.size(), 0)) != -1) 
    { 
     std::cout << "-text_buff sent!." << std::endl; 
     break; 
    } 
    closesocket(sockfd); 
} 

最初に何かを正常に送信したときに終了するようにループしているように見えるので、あなたのループについてはわかりません。

関連する問題