#include <stdio.h> /* for printf() and fprintf() */

#include <sys/socket.h> /* for socket(), connect(), send(), and recv() */

#include <arpa/inet.h> /* for sockaddr_in and inet_addr() */

#include <stdlib.h> /* for atoi() and exit() */

#include <string.h> /* for memset() */

#include <unistd.h> /* for close() */

#define RCVBUFSIZE 32 /* Size of receive buffer */

void DieWithError(char *errorMessage); /* Error handling function */

int main(int argc, char *argv[]) {

int sock; /* Socket descriptor */

struct sockaddr_in echoServAddr; /* Echo server address */

unsigned short echoServPort; /* Echo server port */

char *servIP; /* Server IP address (dotted quad) */

char *echoString; /* String to send to echo server */

char echoBuffer[RCVBUFSIZE]; /* Buffer for echo string */

unsigned int echoStringLen; /* Length of string to echo */

int bytesRcvd, totalBytesRcvd; /* Bytes read in single recv() and total bytes read */

if (argc != 3){ /* Test for correct number of arguments */

fprintf(stderr, "Usage: %s <Server IP> <Echo Word> [<Echo Port>]\n", argv[0]);

exit(1);

}

servIP = argv[1]; /* First arg: server IP address (dotted quad) */

echoServPort = atoi(argv[2]);


/* Create a reliable, stream socket using TCP */

if ((sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)

DieWithError("socket() failed");

/* Construct the server address structure */

memset(&echoServAddr, 0, sizeof(echoServAddr)); /* Zero out structure */

echoServAddr.sin_family = AF_INET; /* Internet address family */

echoServAddr.sin_addr.s_addr = inet_addr(servIP); /* Server IP address */

echoServAddr.sin_port = htons(echoServPort); /* Server port */

/* Establish the connection to the echo server */

if (connect(sock, (struct sockaddr *) &echoServAddr, sizeof(echoServAddr)) < 0)

DieWithError("connect() failed");




echoString = "hello";

echoStringLen = strlen(echoString); /* Determine input length */

/* Send the string to the server */


if (send(sock, echoString, echoStringLen, 0) != echoStringLen)

DieWithError("send() sent a different number of bytes than expected");

/* Receive the same string back from the server */

totalBytesRcvd = 0;

printf("Received: "); /* Setup to print the echoed string */

while (totalBytesRcvd < echoStringLen-1) {

/* Receive up to the buffer size (minus 1 to leave space for a null terminator) bytes from the sender */

if ((bytesRcvd = recv(sock, echoBuffer, RCVBUFSIZE - 1, 0)) <= 0)

DieWithError("recv() failed or connection closed prematurely");

totalBytesRcvd += bytesRcvd; /* Keep tally of total bytes */

echoBuffer[bytesRcvd] = '\0'; /* Terminate the string! */

printf(echoBuffer); /* Print the echo buffer */

}

printf("\n"); /* Print a final linefeed */


close(sock);

return 0;

}


이게 클라고



#include <stdio.h> /* for printf() and fprintf() */

#include <sys/socket.h> /* for socket(), connect(), send(), and recv() */

#include <arpa/inet.h> /* for sockaddr_in and inet_addr() */

#include <stdlib.h> /* for atoi() and exit() */

#include <string.h> /* for memset() */

#include <unistd.h> /* for close() */


#define MAXPENDING 5 /* Maximum outstanding connection requests */

void DieWithError(char *errorMessage); /* Error handling function */

void HandleTCPClient(int clntSocket,int ServSocket); /* TCP client handling function */

int main(int argc, char *argv[])

{

int servSock; /* Socket descriptor for server */

int clntSock; /* Socket descriptor for client */

struct sockaddr_in echoServAddr; /* Local address */

struct sockaddr_in echoClntAddr; /* Client address */

unsigned short echoServPort; /* Server port */

unsigned int clntLen; /* Length of client address data structure */

if (argc != 2) { /* Test for correct number of arguments */

fprintf(stderr, "Usage: %s <Server Port>\n", argv[0]);

exit(1);

}

echoServPort = atoi(argv[1]); /* First arg: local port */

/* Create socket for incoming connections */

if ((servSock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)

DieWithError("socket() failed");

/* Construct local address structure */

memset(&echoServAddr, 0, sizeof(echoServAddr)); /* Zero out structure */

echoServAddr.sin_family = AF_INET; /* Internet address family */

echoServAddr.sin_addr.s_addr = htonl(INADDR_ANY); /* Any incoming interface */

echoServAddr.sin_port = htons(echoServPort); /* Local port */

/* Bind to the local address */

if (bind(servSock, (struct sockaddr *) &echoServAddr, sizeof(echoServAddr)) < 0)

DieWithError("bind() failed");

/* Mark the socket so it will listen for incoming connections */

if (listen(servSock, MAXPENDING) < 0)

DieWithError("listen() failed");

for (;;) /* Run forever */

{

/* Set the size of the in-out parameter */

clntLen = sizeof(echoClntAddr);

/* Wait for a client to connect */

if ((clntSock = accept(servSock, (struct sockaddr *) &echoClntAddr,

&clntLen)) < 0)

DieWithError("accept() failed");

/* clntSock is connected to a client! */

printf("Handling client %s\n", inet_ntoa(echoClntAddr.sin_addr));

HandleTCPClient(clntSock,servSock);

}


/* NOT REACHED */

}


이게 서버임


#include <stdio.h> /* for printf() and fprintf() */

#include <sys/socket.h> /* for recv() and send() */

#include <unistd.h> /* for close() */

#define RCVBUFSIZE 32 /* Size of receive buffer */

void DieWithError(char *errorMessage); /* Error handling function */

void HandleTCPClient(int clntSocket,int servSocket) {

int len,i; /* using read to echo string in server side */

char echoBuffer[RCVBUFSIZE]; /* Buffer for echo string */

int recvMsgSize; /* Size of received message */

/* Receive message from client */

FILE *fp= fopen ("echo_history.log","a");



if ((recvMsgSize = recv(clntSocket, echoBuffer, RCVBUFSIZE, 0)) < 0)

DieWithError("recv() failed");

/* Send received string and receive again until end of transmission */



len = recvMsgSize;

while (recvMsgSize > 0) { /* zero indicates end of transmission */

/* Echo message back to client */


if (send(clntSocket, echoBuffer, recvMsgSize, 0) != recvMsgSize)

DieWithError("send() failed");

/* See if there is more data to receive */

if ((recvMsgSize = recv(clntSocket, echoBuffer, RCVBUFSIZE, 0)) < 0)

DieWithError("recv() failed");

/* print recv msg in sever side*/

for(i=0;i<len;i++){

printf("%c",echoBuffer[i]);

fputc(echoBuffer[i],fp);

}



}

printf("\n");

fclose(fp);

close(clntSocket); /* Close client socket */

close(servSocket);

}


이건 recv 받음 처리해주는거


한번 에코보내고 끝내는게 아니라

/quit 칠때까지 계속 에코 보낼 수 있게 만들려면 어케해야됨?