pues en ambas..
recv(socket,buffer,longitud);
si longitud es mas grande que la de la variable de buffer, se sobreescirbe la memoria.
en strcpy, pues igual que siempre, si la cadena origen es mas larga que el buffer.. se sobreescribe.
mira un ejemplo muy basico:
#include <stdio.h>
#include <winsock2.h>
#include <string.h>
char Buffer[1500];
char Data[500];
WSADATA SockData;
LPHOSTENT mHost;
SOCKADDR_IN mServerInfo;
SOCKET Client;
/*/ ---------------------------------------------------------------------------------------- /*/
int main(){
char elserver[]="irc.red-latina.org";
WSAStartup(0x0202,&SockData);
Client = socket(AF_INET,SOCK_STREAM,0);
mHost = gethostbyname(elserver);
mServerInfo.sin_family = AF_INET;
mServerInfo.sin_port = htons(6667); // 0x0B1A
mServerInfo.sin_addr = *((LPIN_ADDR)*mHost->h_addr_list);
connect(Client,(LPSOCKADDR)&mServerInfo,sizeof(mServerInfo));
/*/ ---------------------------------------------------------------------------------------- /*/
recv(Client,Buffer,2000,0);
printf("[<] %s",Buffer);
strcpy(Data,Buffer);
return 0;
}

Saludos!!