以下のサンプルプログラムを改良して各自の環境で1つのUDPデータグラムで送受信可能なUDPペイロードのサイズが何バイトであるか求める課題があるのですがどのようにすればいいでしょうか。
追記:肝心なことを書いていませんでした。
すみません。
EchoStringLenに着目していたのですが具体的にどのようなことをすればUDPペイロードのサイズを計れるかが調べはしたのですがどうしても分かりませんでした。
1人の回答者様の回答を参考に
UDPEchoClient.cを変えてみました。
ありがとうございました。
c
1//UDPEchoClientを改造 2//... 3memset(&servAddr, 0, sizeof(servAddr)); 4 servAddr.sin_family = AF_INET; 5 servAddr.sin_addr.s_addr = inet_addr(servIP); 6 servAddr.sin_port = htons(servPort); 7//ここから 8 for(echoStringLen = 1; echoStringLen < 65536; echoStringLen++){ 9 sendMsgLen = sendto(sock, echoString, echoStringLen, 0, (struct sockaddr*)&servAddr, sizeof(servAddr)); 10 if(sendMsgLen == -1){ 11 printf("%d\n",echoStringLen); 12 break; 13 } 14 } 15//ここまで 16//...
実行してみたところ4399という数字がクライアント側に表示されましたが、大きな間違いはないでしょうか。
以下サンプルプログラム
c
1//UDPEchoServer.c 2#include <stdio.h> 3#include <string.h> 4#include <arpa/inet.h> 5#include <stdlib.h> 6#include <unistd.h> 7 8#define ECHOMAX (65535) 9 10int main(int argc, char *argv[]) 11{ 12 unsigned short servPort; 13 14 int sock; 15 struct sockaddr_in servAddr; 16 17 struct sockaddr_in clntAddr; 18 unsigned int clntAddrLen; 19 char msgBuffer[ECHOMAX]; 20 int recvMsgLen; 21 int sendMsgLen; 22 23 if (argc != 2){ 24 fprintf(stderr, "Usage: %s <Echo Port>\n", argv[0]); 25 return -1; 26 } 27 servPort = atoi(argv[1]); 28 29 sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); 30 if (sock < 0){ 31 fprintf(stderr, "socket() failed\n"); 32 return -1; 33 } 34 35 memset(&servAddr, 0, sizeof(servAddr)); 36 servAddr.sin_family = AF_INET; 37 servAddr.sin_addr.s_addr = htonl(INADDR_ANY); 38 servAddr.sin_port = htons(servPort); 39 40 if (bind(sock, (struct sockaddr *) &servAddr, sizeof(servAddr)) < 0){ 41 fprintf(stderr, "bind() failed\n"); 42 return -1; 43 } 44 45 for (;;){ 46 clntAddrLen = sizeof(clntAddr); 47 48 recvMsgLen = recvfrom(sock, msgBuffer, ECHOMAX, 0, (struct sockaddr*)&clntAddr, &clntAddrLen); 49 50 if(recvMsgLen < 0){ 51 fprintf(stderr, "recvfrom() failed\n"); 52 return -1; 53 } 54 55 printf("Handling client %s\n", inet_ntoa(clntAddr. sin_addr)); 56 57 sendMsgLen = sendto(sock, msgBuffer, recvMsgLen, 0, (struct sockaddr*)&clntAddr, sizeof(clntAddr)); 58 59 if (recvMsgLen != sendMsgLen){ 60 fprintf(stderr, "sendto() sent a different number of bytes than expected\n"); 61 return -1; 62 } 63 } 64} 65
c
1//UDPEchoClient.c 2#include <stdio.h> 3#include <string.h> 4#include <arpa/inet.h> 5#include <stdlib.h> 6#include <unistd.h> 7 8#define ECHOMAX (65535) 9 10int main(int argc, char *argv[]) 11{ 12 char *servIP; 13 char *echoString; 14 int echoStringLen; 15 unsigned short servPort; 16 17 int sock; 18 struct sockaddr_in servAddr; 19 20 int sendMsgLen; 21 struct sockaddr_in fromAddr; 22 unsigned int fromAddrLen; 23 char msgBuffer[ECHOMAX+1]; 24 int recvMsgLen; 25 26 if (argc != 4){ 27 fprintf(stderr, "Usage: %s <Server IP> <Echo Port> <Echo Word>\n", argv[0]); 28 return -1; 29 } 30 servIP = argv[1]; 31 servPort = atoi(argv[2]); 32 echoString = argv[3]; 33 echoStringLen = strlen(echoString); 34 35 sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); 36 if(sock < 0){ 37 fprintf(stderr, "socket() failed\n"); 38 return -1; 39 } 40 41 memset(&servAddr, 0, sizeof(servAddr)); 42 servAddr.sin_family = AF_INET; 43 servAddr.sin_addr.s_addr = inet_addr(servIP); 44 servAddr.sin_port = htons(servPort); 45 46 sendMsgLen = sendto(sock, echoString, echoStringLen, 0, (struct sockaddr*)&servAddr, sizeof(servAddr)); 47 48 if (echoStringLen != sendMsgLen){ 49 fprintf(stderr, "sendto() sent a different number of bytes of than expected\n"); 50 return -1; 51 } 52 53 fromAddrLen = sizeof(fromAddr); 54 55 recvMsgLen = recvfrom(sock, msgBuffer, ECHOMAX, 0, (struct sockaddr*)&fromAddr, &fromAddrLen); 56 if (recvMsgLen != echoStringLen){ 57 fprintf(stderr, "recvfrom() failed\n"); 58 return -1; 59 } 60 61 if (fromAddr.sin_addr.s_addr != servAddr.sin_addr.s_addr){ 62 fprintf(stderr, "Error: received a packet from unknown source\n"); 63 return -1; 64 } 65 66 msgBuffer[recvMsgLen] = '\0'; 67 68 printf("Received: %s\n", msgBuffer); 69 70 close(sock); 71 72 return 0; 73} 74
回答1件
あなたの回答
tips
プレビュー