我在作socket接受数据编程,有一个疑问一直困惑着我:
if(num=recv(sockfd,&sRevbuf,length,0))==-1)
如果socket异常出错是返回-1,那如果socket是正常的关闭,或者回话是正常的关闭,是不是也返回-1。随便还有一个问题关于memcpy(&des[(i-1)*1024],&suc,1024),如果des初始化是char des[1024*300],但是i如果取的超过了300,其实是溢出,这样程序执行到这里会中断呢,还是就会越界拷贝在一块未知的区域呢?
if(num=recv(sockfd,&sRevbuf,length,0))==-1)
如果socket异常出错是返回-1,那如果socket是正常的关闭,或者回话是正常的关闭,是不是也返回-1。随便还有一个问题关于memcpy(&des[(i-1)*1024],&suc,1024),如果des初始化是char des[1024*300],但是i如果取的超过了300,其实是溢出,这样程序执行到这里会中断呢,还是就会越界拷贝在一块未知的区域呢?
If no error occurs, recv returns the number of bytes received. If the connection has been gracefully closed, the return value is zero. Otherwise, a value of SOCKET_ERROR is returned, and a specific error code can be retrieved by calling WSAGetLastError.
#include "winsock2.h"void main() {
//----------------------
// Initialize Winsock
WSADATA wsaData;
int iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
if (iResult != NO_ERROR)
printf("Error at WSAStartup()\n"); //----------------------
// Create a SOCKET for connecting to server
SOCKET ConnectSocket;
ConnectSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (ConnectSocket == INVALID_SOCKET) {
printf("Error at socket(): %ld\n", WSAGetLastError());
WSACleanup();
return;
} //----------------------
// The sockaddr_in structure specifies the address family,
// IP address, and port of the server to be connected to.
sockaddr_in clientService;
clientService.sin_family = AF_INET;
clientService.sin_addr.s_addr = inet_addr( "127.0.0.1" );
clientService.sin_port = htons( 27015 ); //----------------------
// Connect to server.
if ( connect( ConnectSocket, (SOCKADDR*) &clientService, sizeof(clientService) ) == SOCKET_ERROR) {
printf( "Failed to connect.\n" );
WSACleanup();
return;
} //----------------------
// Declare and initialize variables.
int bytesSent;
int bytesRecv = 0;
char sendbuf[32] = "Client: Sending data.";
char recvbuf[32] = ""; //----------------------
// Send and receive data.
bytesSent = send( ConnectSocket, sendbuf, strlen(sendbuf), 0 );
printf( "Bytes Sent: %ld\n", bytesSent ); while( bytesRecv != SOCKET_ERROR ) {
bytesRecv = recv( ConnectSocket, recvbuf, 32, 0 );
if ( bytesRecv == 0 || WSAGetLastError() == WSAECONNRESET ) {
printf( "Connection Closed.\n");
break;
}
printf( "Bytes Recv: %ld\n", bytesRecv );
} WSACleanup();
return;
}