求助,在线等-------网络编程的问题,关于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:指定调用方式。