gpt4 book ai didi

c++ - winsock客户端和服务器通信

转载 作者:太空宇宙 更新时间:2023-11-04 12:22:31 24 4
gpt4 key购买 nike

抱歉,我知道我在过去一天一直在发布与同一主题相关的主题,但我遇到了另一个问题。

服务器.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;
}

客户端.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;
}

我可以很好地运行服务器和客户端,但我只能从客户端发送一个单词(由于某种原因不能发送一个句子),该单词会在服务器控制台上打印出来,但一旦在服务器上打印出来控制台输出“接收错误”并关闭。

最佳答案

您不能假设调用一次 send() 就足够了(recv() 也是如此)。您需要遍历数据,直到发送/接收到所有数据。

此外,您很可能不希望总是发送 128 个字符,而应该只发送所需的长度(并在消息中包含终止符或前缀长度)。

关于c++ - winsock客户端和服务器通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4247039/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com