Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Can';t使用winsock2.lib向客户端发送数据_C++_Sockets - Fatal编程技术网

C++ Can';t使用winsock2.lib向客户端发送数据

C++ Can';t使用winsock2.lib向客户端发送数据,c++,sockets,C++,Sockets,我们有tcp/ip应用程序项目,在源代码中使用winsock2.lib,服务器和客户端功能如下: 服务器: #undef UNICODE #define WIN32_LEAN_AND_MEAN #include <iostream> #include<string> #include <windows.h> #include <winsock2.h> #include <ws2tcpip.h> #include <stdlib.h

我们有tcp/ip应用程序项目,在源代码中使用winsock2.lib,服务器和客户端功能如下:

服务器:

#undef UNICODE
#define WIN32_LEAN_AND_MEAN
#include <iostream>
#include<string>
#include <windows.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdlib.h>
#include <stdio.h>
#pragma comment (lib, "Ws2_32.lib")
using namespace::std;



int server()
{
    string SERVER_ADDRESS= "172.17.11.138";
    int PORT_NUMBER = 27015;

    sockaddr_in server;
    server.sin_family=AF_INET;
    server.sin_port=htons(PORT_NUMBER);
    server.sin_addr.S_un.S_addr=inet_addr(&SERVER_ADDRESS[0]);


    WSADATA wsaData;
        int iResult;
    SOCKET ListenSocket = INVALID_SOCKET;
        SOCKET ClientSocket = INVALID_SOCKET;

   // Initialize Winsock
       iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
       if (iResult != 0) {
       printf("WSAStartup failed with error: %d\n", iResult);
       return 1;
    }
    int iSendResult;
char recvbuf[256];
int recvbuflen = 256;

// Create a SOCKET for connecting to server
ListenSocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if (ListenSocket == INVALID_SOCKET) {
    printf("socket failed with error: %ld\n", WSAGetLastError());
    WSACleanup();
    return 1;
}

// Setup the TCP listening socket
iResult = bind( ListenSocket, (struct sockaddr*)&server,sizeof(server));
if (iResult == SOCKET_ERROR) {
    printf("bind failed with error: %d\n", WSAGetLastError());
    closesocket(ListenSocket);
    WSACleanup();
    return 1;
}

iResult = listen(ListenSocket, SOMAXCONN);
if (iResult == SOCKET_ERROR) {
    printf("listen failed with error: %d\n", WSAGetLastError());
    closesocket(ListenSocket);
    WSACleanup();
    return 1;
}

// Accept a client socket
ClientSocket = accept(ListenSocket, NULL, NULL);
if (ClientSocket == INVALID_SOCKET) {
    printf("accept failed with error: %d\n", WSAGetLastError());
    closesocket(ListenSocket);
    WSACleanup();
    return 1;
}

// No longer need server socket
closesocket(ListenSocket);

// Echo the buffer back to the sender
iSendResult = send( ClientSocket, recvbuf, iResult, 0 );
if (iSendResult == SOCKET_ERROR) {
    printf("send failed with error: %d\n", WSAGetLastError());
    closesocket(ClientSocket);
    WSACleanup();
    return 1;
}
}
#未定义UNICODE
#定义WIN32_精益_和_平均值
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#pragma注释(lib,“Ws2_32.lib”)
使用namespace::std;
int服务器()
{
字符串服务器地址=“172.17.11.138”;
int端口号=27015;
服务器中的sockaddr_;
server.sinu family=AF\u INET;
server.sinu port=htons(端口号);
server.sin_addr.S_un.S_addr=inet_addr(&server_addr[0]);
WSADATA WSADATA;
国际结果;
套接字ListenSocket=无效的\u套接字;
套接字ClientSocket=无效的\u套接字;
//初始化Winsock
iResult=WSAStartup(MAKEWORD(2,2)和wsaData);
如果(iResult!=0){
printf(“WSAStartup失败,错误:%d\n”,iResult);
返回1;
}
int iSendResult;
char recvbuf[256];
int recvbuflen=256;
//创建用于连接到服务器的套接字
ListenSocket=socket(AF_INET、SOCK流、IPPROTO_TCP);
if(ListenSocket==无效的_套接字){
printf(“套接字失败,错误:%ld\n”,WSAGetLastError());
WSACleanup();
返回1;
}
//设置TCP侦听套接字
iResult=bind(ListenSocket,(struct sockaddr*)&server,sizeof(server));
if(iResult==SOCKET\u错误){
printf(“绑定失败,错误:%d\n”,WSAGetLastError());
闭合插座(ListenSocket);
WSACleanup();
返回1;
}
iResult=侦听(ListenSocket,SOMAXCONN);
if(iResult==SOCKET\u错误){
printf(“侦听失败,错误为:%d\n”,WSAGetLastError());
闭合插座(ListenSocket);
WSACleanup();
返回1;
}
//接受客户端套接字
ClientSocket=accept(ListenSocket,NULL,NULL);
if(ClientSocket==无效的_SOCKET){
printf(“接受失败,错误:%d\n”,WSAGetLastError());
闭合插座(ListenSocket);
WSACleanup();
返回1;
}
//不再需要服务器套接字
闭合插座(ListenSocket);
//将缓冲区回显给发送方
iSendResult=send(ClientSocket,recvbuf,iResult,0);
if(iSendResult==套接字错误){
printf(“发送失败,错误:%d\n”,WSAGetLastError());
闭合插座(ClientSocket);
WSACleanup();
返回1;
}
}
客户:

#define WIN32_LEAN_AND_MEAN

#include <windows.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdlib.h>
#include <stdio.h>


#pragma comment (lib, "Ws2_32.lib")
#pragma comment (lib, "Mswsock.lib")
#pragma comment (lib, "AdvApi32.lib")


int client()
{
WSADATA wsaData;
SOCKET ConnectSocket = INVALID_SOCKET;
string SERVER_ADDRESS= "172.17.11.138";

char *sendbuf = "this is a test";
char recvbuf[256];
int PORT_NUMBER = 27015;
int iResult;

sockaddr_in server;
server.sin_family=AF_INET;
server.sin_port=htons(PORT_NUMBER);
server.sin_addr.S_un.S_addr=inet_addr(&SERVER_ADDRESS[0]);
// Initialize Winsock
iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
if (iResult != 0) {
    printf("WSAStartup failed with error: %d\n", iResult);
    return 1;
}

// Create a SOCKET for connecting to server
ConnectSocket = socket(AF_INET,SOCK_STREAM, IPPROTO_TCP);
if (ConnectSocket == INVALID_SOCKET) {
    printf("socket failed with error: %ld\n", WSAGetLastError());
    WSACleanup();
    return 1;
}

iResult = connect( ConnectSocket,(struct sockaddr*)&server,sizeof(server));
if (iResult == SOCKET_ERROR) {
    closesocket(ConnectSocket);
    printf("socket failed with error: %ld\n", WSAGetLastError());
    WSACleanup();
    return 1;
}
if (ConnectSocket == INVALID_SOCKET) {
    printf("Unable to connect to server!\n");
    WSACleanup();
    return 1;
    }

 iResult = recv(ConnectSocket, recvbuf, 256, 0);
    if ( iResult > 0 )
        printf("Bytes received: %d\n", iResult);
    else if ( iResult == 0 )
        printf("Connection closed\n");
    else
        printf("recv failed with error: %d\n", WSAGetLastError());
}
#定义WIN32_LEAN_和_MEAN
#包括
#包括
#包括
#包括
#包括
#pragma注释(lib,“Ws2_32.lib”)
#pragma注释(lib,“Mswsock.lib”)
#pragma注释(lib,“AdvApi32.lib”)
int客户机()
{
WSADATA WSADATA;
SOCKET ConnectSocket=无效的_套接字;
字符串服务器地址=“172.17.11.138”;
char*sendbuf=“这是一个测试”;
char recvbuf[256];
int端口号=27015;
国际结果;
服务器中的sockaddr_;
server.sinu family=AF\u INET;
server.sinu port=htons(端口号);
server.sin_addr.S_un.S_addr=inet_addr(&server_addr[0]);
//初始化Winsock
iResult=WSAStartup(MAKEWORD(2,2)和wsaData);
如果(iResult!=0){
printf(“WSAStartup失败,错误:%d\n”,iResult);
返回1;
}
//创建用于连接到服务器的套接字
ConnectSocket=socket(AF\u INET、SOCK\u STREAM、IPPROTO\u TCP);
if(ConnectSocket==无效的_套接字){
printf(“套接字失败,错误:%ld\n”,WSAGetLastError());
WSACleanup();
返回1;
}
iResult=connect(ConnectSocket,(struct sockaddr*)&server,sizeof(server));
if(iResult==SOCKET\u错误){
闭合插座(连接插座);
printf(“套接字失败,错误:%ld\n”,WSAGetLastError());
WSACleanup();
返回1;
}
if(ConnectSocket==无效的_套接字){
printf(“无法连接到服务器!\n”);
WSACleanup();
返回1;
}
iResult=recv(ConnectSocket,recvbuf,256,0);
如果(iResult>0)
printf(“收到的字节数:%d\n”,iResult);
else if(iResult==0)
printf(“连接关闭\n”);
其他的
printf(“recv失败,错误:%d\n”,WSAGetLastError());
}

我们编译了上面的代码,服务器和客户端可以相互连接(使用tcpview应用程序检查),但是,我们希望将数据从服务器发送到客户端,winsock2返回错误10057(如果关闭侦听套接字,错误将为10038),发送函数返回-1

一个问题是,您从服务器发送什么?此代码:

iSendResult = send( ClientSocket, recvbuf, iResult, 0 );

似乎正在发送未初始化缓冲区的
iResult
字节(这是上次
listen
调用的0)。客户端似乎有一个未在任何地方使用的
sendbuf
。似乎有一些bug需要清理,您将能够正常工作…

首先,您应该避免在
WSAStartup()
之前调用任何winsock函数,这包括
htons()
inet\u addr()
。其次,错误10057是
WSAENOTCONN