2007年8月31日金曜日

echoサーバ




#include<stdio.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>

#define MAX 5
#define RCVSIZE 32

void errorExit(char *message);
void Handling(int clntSocket);


int main(int argc,char *argv[])
{
int servSocket;
int clntSocket;
struct sockaddr_in echoServAddr;
struct sockaddr_in echoClntAddr;
unsigned short echoServPort;
unsigned int clntLen;

if(argc != 2){
fprintf(stderr,"Usage: %s <Port>\n",argv[0]);
exit(1);
}

echoServPort = atoi(argv[1]);

if((servSocket = socket(PF_INET,SOCK_STREAM,IPPROTO_TCP)) < 0)
errorExit("socket error\n");

memset(&echoServAddr,0,sizeof(echoServAddr));
echoServAddr.sin_family = AF_INET;
echoServAddr.sin_addr.s_addr = htonl(INADDR_ANY);
echoServAddr.sin_port = htons(echoServPort);

if(bind(servSocket,(struct sockaddr *) &echoServAddr,sizeof(echoServAddr)) < 0)
errorExit("bind error\n");

if(listen(servSocket,MAX) < 0)
errorExit("listen error\n");

for(;;){

clntLen = sizeof(echoClntAddr);

if((clntSocket = accept(servSocket,(struct sockaddr *) &echoClntAddr,&clntLen)) < 0)
errorExit("accept error\n");

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

Handling(clntSocket);
}


}

void Handling(int clntSocket)
{
char echoBuffer[RCVSIZE];
int recvMesSize;


if((recvMesSize = recv(clntSocket,echoBuffer,RCVSIZE,0)) < 0)
errorExit("recv error\n");

while(recvMesSize > 0)
{
if(send(clntSocket,echoBuffer,recvMesSize,0) != recvMesSize)
errorExit("send error\n");

if((recvMesSize = recv(clntSocket,echoBuffer,RCVSIZE,0)) < 0)
errorExit("recv error\n");
}

close(clntSocket);
}



関数名、変数名を付けるセンスがないって気づいてしまった。。。。





0 件のコメント:

コメントを投稿