读书人

网络编程的有关问题关于recv函数的

发布时间: 2012-09-24 13:49:42 作者: rapoo

求助,在线等-------网络编程的问题,关于recv函数的使用问题
服务器代码如下: 红色部分 返回值是-1,各位大侠给看看是怎么回事,在线等,谢谢了
#include <winsock2.h>
#include <iostream.h>
#include <stdio.h>
#pragma comment(lib,"ws2_32.lib")

void main(void)
{
WSADATA wsaData;
SOCKET ListeningSocket;
SOCKET NewConnection;
SOCKADDR_IN ServerAddr;
SOCKADDR_IN ClientAddr;
int Port = 5150;
int bConning = FALSE;

// 初始化Windows Socket 2.2

WSAStartup(MAKEWORD(2,2),&wsaData);

// 创建一个新的Socket来响应客户端的连接请求

ListeningSocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);

// 填写服务器地址信息
// 端口为5150
// IP地址为INADDR_ANY,注意使用htonl将IP地址转换为网络格式

ServerAddr.sin_family = AF_INET;
ServerAddr.sin_port = htons(Port);
ServerAddr.sin_addr.s_addr = htonl(INADDR_ANY);

// 绑定监听端口

bind(ListeningSocket,(LPSOCKADDR)&ServerAddr,sizeof(ServerAddr));

// 开始监听,指定最大同时连接数为5

int aa = listen(ListeningSocket,5);

// 接受新的连接
int ClientAddrLen = sizeof(ClientAddr);
NewConnection = accept(ListeningSocket,(SOCKADDR *) &ClientAddr,&ClientAddrLen);

// 新的连接建立后,就可以互相通信了

if(INVALID_SOCKET == NewConnection)
{
// 并关闭监听Socket,然后退出应用程序
closesocket(NewConnection);
closesocket(ListeningSocket);

// 释放Windows Socket DLL的相关资源

WSACleanup();

system("PAUSE");

printf("连接失败\n");
return;
}
else
{
bConning = TRUE;
printf("连接成功\n");
}

char *pClientIp = inet_ntoa(ClientAddr.sin_addr);
u_short clientPort = ntohs(ClientAddr.sin_port);
printf("Accept a Client.\n");
printf("IP:%s\nPort:%d\n",pClientIp,clientPort);


BOOL retVal = TRUE;
BOOL bLineEnd = FALSE;
int nReadLen = 0;
int nDataLen = 0;
char *buf = NULL;

while(!bLineEnd && bConning)
{
//Sleep(1000);
nReadLen = recv(NewConnection,buf+nDataLen,14,0);printf("nReadLen:%d\n",nReadLen);

//错误处理
if(SOCKET_ERROR == nReadLen)
{
int nErrCode = WSAGetLastError();

if(WSAENOTCONN == nErrCode)
{
printf("The socket is not connected!\n");
}
else if(WSAESHUTDOWN == nErrCode)
{
printf("The socket has been shut down!\n");
}
else if(WSAETIMEDOUT == nErrCode)
{
printf("The connection has been dropped!\n");
}
else if(WSAECONNRESET == nErrCode)
{
printf("The virtual circuit was reset by the remote side!\n");
}

retVal = FALSE;
break;
}

if(0 == nReadLen) //客户端关闭
{
printf("客户端关闭!\n");
retVal = FALSE;
break;
}

if('\n' == *(buf + nDataLen))
{
printf("接收完毕!\n");
bLineEnd = TRUE;
}
else
{
nDataLen += nReadLen;
}
}

printf("接收的数据为:%s\n",buf);

system("PAUSE");



// 并关闭监听Socket,然后退出应用程序
closesocket(NewConnection);
closesocket(ListeningSocket);

// 释放Windows Socket DLL的相关资源

WSACleanup();
}

客户端代码:
#include <winsock2.h>
#include <stdio.h>

#pragma comment(lib,"ws2_32.lib")

void main(void)
{
WSADATA wsaData;
SOCKET s;
SOCKADDR_IN ServerAddr;
int Port = 5150;
int retVal;
BOOL bConning = FALSE;

//初始化Windows Socket 2.2

WSAStartup(MAKEWORD(2,2),&wsaData);

// 创建一个新的Socket来连接服务器

s = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);

// 填写客户端地址信息
// 端口为5150
// 服务器IP地址为"136.149.3.29",注意使用inet_addr将IP地址转换为网络格式



ServerAddr.sin_family = AF_INET;
ServerAddr.sin_port = htons(Port);
ServerAddr.sin_addr.s_addr = inet_addr("192.168.0.10");

// 向服务器发出连接请求

retVal = connect(s,(SOCKADDR *) &ServerAddr,sizeof(ServerAddr));

// 新的连接建立后,就可以互相通信了
if(retVal == SOCKET_ERROR)
{
printf("连接服务器失败\n");

// 并关闭监听Socket,然后退出应用程序

closesocket(s);

// 释放Windows Socket DLL的相关资源

WSACleanup();

return;
}
else
{
bConning = TRUE;
printf("连接服务器成功\n");
}

char bufSend[20];

strcpy(bufSend,"Hello,Server!\n");
retVal = send(s,bufSend,strlen(bufSend),0);

if(retVal == SOCKET_ERROR)
{
printf("发送数据失败\n");
}
else
{
printf("发送数据成功\n");
}

// 并关闭监听Socket,然后退出应用程序

closesocket(s);

// 释放Windows Socket DLL的相关资源

WSACleanup();
}


[解决办法]
nReadLen = recv(NewConnection,buf+nDataLen,14,0);
参数用错了,第二个参数要求是一个有效的缓冲区比如 char buf[14];
int PASCAL FAR recv( SOCKET s, char FAR* buf, int len, int flags);
  s:一个标识已连接套接口的描述字。
  buf:用于接收数据的缓冲区。
  len:缓冲区长度。
  flags:指定调用方式。

读书人网 >C++

热点推荐