2007年9月7日金曜日

UDP版echoクライアント







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

#define MAX 255

void exitWithError(char *message);

int main(int argc,char *argv[])
{
int sock;
struct sockaddr_in servAddr;
struct sockaddr_in fromAddr;
unsigned short servPort;
unsigned int fromSize;
char *echoString;
char *servIP;
char echoBuffer[MAX+1];
int echoStringLen;
int recvStringLen;



if(argc < 3){
fprintf(stderr,"Usage: %s <ServIP> <Word> [<Serv Port>]\n",argv[0]);
exit (1);
}

echoString = argv[2];
servIP = argv[1];


if((echoStringLen = strlen(echoString)) > MAX)
exitWithError("word is too long\n");


if(argc == 4)
servPort = atoi(argv[3]);
else
servPort = 7;


if((sock = socket(PF_INET,SOCK_DGRAM,IPPROTO_UDP)) < 0)
exitWithError("sockt() error\n");

memset(&servAddr,0,sizeof(servAddr));
servAddr.sin_family = AF_INET;
servAddr.sin_addr.s_addr = inet_addr(servIP);
servAddr.sin_port = htons(servPort);


if(sendto(sock,echoString,echoStringLen,0,(struct sockaddr *) &servAddr,sizeof(servAddr)) != echoStringLen)
exitWithError("sendto() error\n");


fromSize = sizeof(fromAddr);


if((recvStringLen = recvfrom(sock,echoBuffer,MAX,0,(struct sockaddr *) &fromAddr,&fromSize)) != echoStringLen)
exitWithError("recvfrom() error\n");


if(servAddr.sin_addr.s_addr != fromAddr.sin_addr.s_addr)
{
fprintf(stderr,"recv from unkown host\n");
exit (1);
}

echoBuffer[recvStringLen] = '\0';
printf("Received: %s\n",echoBuffer);

close(sock);

return 0;
}

void exitWithError(char *message)
{
printf("%s\n",message);
exit (1);
}



コンパイルも通って実行もできるのに、なぜかエコーされてこないと思ったら


udpのエコーサーバが動いてませんでした。。。。


それで1時間ぐらい悩んでしまいました。





0 件のコメント:

コメントを投稿