【问题标题】:Can't send data to client using winsock2.lib无法使用 winsock2.lib 向客户端发送数据
【发布时间】:2013-06-18 12:50:16
【问题描述】:

我们有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;
}
}

客户:

#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());
}

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

【问题讨论】:

  • 首先,你应该避免在WSAStartup()之前调用any winsock函数,这包括htons()inet_addr()。其次,错误10057是WSAENOTCONN

标签: c++ sockets


【解决方案1】:

嗯,一个问题是,你从你的服务器发送什么?这段代码:

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

似乎正在发送未初始化缓冲区recvbufiResult 字节(从上次listen 调用中为0)。客户端似乎有一个sendbuf,它没有在任何地方使用。似乎需要清理一些错误,然后您就可以正常工作了...

【讨论】:

    猜你喜欢
    • 2018-10-19
    • 2013-02-01
    • 2017-05-07
    • 1970-01-01
    • 2015-01-08
    • 2021-02-21
    • 2012-10-13
    • 1970-01-01
    • 2013-09-14
    相关资源
    最近更新 更多