以下のコードは、sendとrecv関数を示します。
サーバ
#define DEFAULT_BUFLEN 512
char recvbuf[DEFAULT_BUFLEN];
char sendbuf[DEFAULT_BUFLEN];
int iResult,
recvbuflen = DEFAULT_BUFLEN,
sendbuflen = DEFAULT_BUFLEN;
do
{
ZeroMemory(recvbuf, recvbuflen);
iResult = recv(ClientSocket, recvbuf, recvbuflen, 0);
if (0 < iResult)
{
printf("Bytes received: %d\n", iResult);
printf("received data: [%s]\n", recvbuf);
ZeroMemory(sendbuf, sendbuflen);
memcpy(sendbuf, recvbuf, iResult);
}
else if (iResult == 0)
{
printf("Connection closing...\n");
}
else
{
printf("recv failed: %d\n", WSAGetLastError());
closesocket(ClientSocket);
WSACleanup();
return 1;
}
} while (0 < iResult);
printf("send data: [%s]\n", sendbuf);
iResult = send(ClientSocket, sendbuf, (int)strlen(sendbuf), 0);
if (iResult == SOCKET_ERROR)
{
printf("send failed: %d\n", WSAGetLastError());
closesocket(ClientSocket);
WSACleanup();
return 1;
}
printf("Bytes Sent: %ld\n", iResult);
クライアント
#define DEFAULT_BUFLEN 512
char *sendbuf = "this is a test";
char recvbuf[DEFAULT_BUFLEN];
int iResult;
iResult = send(ConnectSocket, sendbuf, (int)strlen(sendbuf), 0);
if (iResult == SOCKET_ERROR)
{
printf("send failed: %d\n", WSAGetLastError());
closesocket(ConnectSocket);
WSACleanup();
return 1;
}
printf("Bytes Sent: %ld\n", iResult);
iResult = shutdown(ConnectSocket, SD_SEND);
if (iResult == SOCKET_ERROR)
{
printf("shutdown failed: %d\n", WSAGetLastError());
closesocket(ConnectSocket);
WSACleanup();
return 1;
}
do
{
ZeroMemory(recvbuf, recvbuflen);
iResult = recv(ConnectSocket, recvbuf, recvbuflen, 0);
if (0 < iResult)
{
printf("Bytes received: %d\n", iResult);
printf("recieved data: [%s]\n", recvbuf);
}
else if (iResult == 0)
{
printf("Connection closed\n");
}
else
{
printf("recv failed: %d\n", WSAGetLastError());
}
} while (0 < iResult);
そのsendとrecvの両関数は送信または受信バイト数を整数値として戻します、またはエラー値を戻します。
各々の関数も、同様のパラメータを取ります: そのアクティブソケット、charバッファ、送受信バイト数、そして、使われるいくつかのフラグでも。
完全なるソースコード
|